`\underbrace` ist nicht voll expandierbar, also muss man es schützen. Überhaupt ist `\xdef` bei LaTeX meist durch `\protected@xdef` zu ersetzen, damit man nicht voll expandierbare Befehle mit `\protect` schützen kann:
\documentclass[border=5mm, varwidth]{standalone}
\usepackage{tikz, amsmath}
\begin{document}
Tut: $\underbrace{1}_{a}$
Tut nicht mit underbrace:
\newcommand{\ylist}{}% Name reservieren
\newcommand\ausgabe{%
\ifnum\y=0 {null}
%\else $\pgfmathresult$ % Tut
\else $\protect\underbrace{\pgfmathresult}_{a}$ % Tut nicht ! ! !
\fi
}
\let\ylist=\empty% Liste erstellen
\makeatletter
\foreach \y in {0,1,2,3}
{
\pgfmathparse{\y+0.5}%
\ifx\empty\ylist{} \protected@xdef\ylist{\ausgabe}%
\else \protected@xdef\ylist{\ylist,\ausgabe}%
\fi
}
\makeatother
Anzeigen: \ylist
\end{document}
[![\protect\underbrace funktioniert, wenn man \protected@xdef verwendet][1]][1]
[1]: http://texwelt.de/wissen/upfiles/test_20180213_183704.png