You can't do it with \@ifnextchar because as soon as TeX executes it a new table cell will start.
You can do it with \ifx:
\documentclass{article}
\makeatletter
\newcommand{\starttb}{%
\begin{tabular}{|l|c|}
\hline
\fc@iteration
}
\newcommand\fc@iteration[1]{%
\ifx\stoptb#1%
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\end{tabular}}
{\fc@absorb{#1}}%
}
\newcommand{\fc@absorb}[2]{%
#1 & #2 \\ \hline
\fc@iteration
}
\def\stoptb{}
\makeatother
\begin{document}
\starttb
{1}{2}
{3}{4}
\stoptb
\quad
\starttb
{1}{2}
{3}{4}
{5}{6}
{7}{8}
\stoptb
\end{document}

An alternative implementation, where code could be added for ensuring an even number of arguments. Here the data is first stored in a token register, to be delivered at once.
\documentclass{article}
\makeatletter
\newtoks\fc@table
\newcommand{\starttb}{%
\fc@table={\begin{tabular}{|l|c|}\hline}%
\fc@iteration
}
\newcommand\fc@iteration{%
\@ifnextchar\stoptb{\fc@finish}{\fc@iterate}%
}
\newcommand{\fc@iterate}[2]{%
\fc@table=\expandafter{\the\fc@table #1 & #2 \\ \hline}%
\fc@iteration
}
\newcommand{\fc@finish}[1]{\the\fc@table\end{tabular}}
\def\stoptb{\stoptb}
\makeatother
\begin{document}
\starttb
{1}{2}
{3}{4}
\stoptb
\quad
\starttb
{1}{2}
{3}{4}
{5}{6}
{7}{8}
\stoptb
\end{document}
\@ifnextchardoes not work by expansion and so, upon finding it TeX will start a new cell. – egreg Sep 20 '17 at 08:38