This makes use of the fact that lengths can be stored in \newcount registers as numbers (in sp units). With this trick, I can divide two lengths using \divide and achieve truncation of the decimal portion.
The macro \nexttab tabs to the next increment of \reflen, here specified as 1em. In the MWE, I place an X at the next available tab location. The rules underneath are there merely to confirm the authenticity of the tab.
\documentclass{article}
\usepackage{tabto}
\newlength\reflen
\newcount\z
\newcount\refsp
\reflen=1em
\refsp=\reflen
\newcommand\nexttab{%
\tabto*{0em}%
\z=\TabPrevPos
\divide\z by \refsp
\tabto{\the\numexpr\z +1\relax\reflen}%
}
\begin{document}
\noindent This is a test\nexttab X\\
This is a\nexttab X\\
This is\nexttab X\\
This\nexttab X
\noindent\smash{%
\rule{.02\reflen}{2ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{2ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{2ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{5ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{8ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{8ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{11ex}\rule{.98\reflen}{1pt}}
\end{document}

If \reflen is adjusted to 1.1em, the result is

Finally, we learn that a CM m is actually 0.84em in width
\documentclass{article}
\usepackage{tabto}
\newlength\reflen
\newcount\z
\newcount\refsp
\reflen=.84em
\refsp=\reflen
\newcommand\nexttab{%
\tabto*{0em}%
\z=\TabPrevPos
\divide\z by \refsp
\tabto{\the\numexpr\z +1\relax\reflen}%
}
\begin{document}
\noindent This is a test\nexttab mmmmm\\
This is a\nexttab mmmmm\\
This is\nexttab mmmmm\\
This\nexttab mmmmm
\noindent\smash{%
\rule{.02\reflen}{2ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{2ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{2ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{5ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{8ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{8ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{11ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{11ex}\rule{.98\reflen}{1pt}%
\rule{.02\reflen}{11ex}\rule{.98\reflen}{1pt}%
}
\end{document}

\zsavepos(or the underlying\pdfsaveposprimitive) will always take at least two latex runs and be unstable if you have more than one of these in a paragraph, taking more runs to converge. In almost all cases such an alignment is more naturally achieved in tex using an\halignbased alignment such astabularortabbing, what is the actual use case here? – David Carlisle Feb 01 '21 at 15:22