Dns une structure conditionnelle à chaque `\if...` doit correspondre un `\fi`.
Le problème ici est composé puisque `\newif\ifsolution` est dans la branche où le test échoue échoue, et là TeX ne réfléchit pas et va chercher (et trouver) le `\fi` qui correspond à `\ifsolution`, et pour lui `\ifsolution`. Pour lui, maintenant, `\ifdefined` a besoin de `\fi` qu'il va chercher sans le trouver.
Voici une solution:
\documentclass{article}
\begin{document}
\newif\ifsolution
\makeatletter
\@ifundefined{ifsolution}
{%
n'est pas définie, donc:
\newif\ifsolution
\solutiontrue
}{%
définie
}
\makeatother
et voila
\end{document}