Je vous fais remarquer que `xindy` n'y est pour rien. C'est le package `imakeidx` (ou son fork `indextools`) qui définit `\printindex` pour que celle-ci ferme le fichier où sont écrites les entrées. Dans votre premier code, vous auriez observé le même comportement en utilisant le package `imakeidx` ou `indextools` !
Cette définition de `\printindex` fait qu'après son exécution, les entrées d'index ne sont plus écrites dans le fichier rassemblant les entrées d'index, ce qui d'ailleurs me semble tout à fait logique. Pourquoi diable voudriez-vous rajouter des entrées d'index après l'impression de l'index ?
EDIT
À l'aide de `\AtEndDocument`, je propose de reléguer en fin de document la fermeture du fichier et l'appel au programme externe.
\documentclass{article}
\usepackage{fontspec}
\usepackage[xindy]{indextools}
\makeatletter
\def\indtl@putindex#1{%
\ifindtl@nonewpage\else
\indtl@clearpage
\fi
\let\indtl@indexname\indexname % keep \indexname
\@nameuse{indtl@set@#1}\indtl@decide
\AtEndDocument{%
\indtl@clearpage
\immediate\closeout\csname #1@idxfile\endcsname
\if@tempswa % we can call the external program
\indtl@exec{\indtl@program\indtl@options#1.idx}%
\else
\indtl@finalmessage{#1}%
\fi}%
\ifKV@indtl@intoc
\def\indtl@maybeaddtotoc{\@nameuse{phantomsection}%
\addcontentsline{toc}{\indtl@toclevel}{\indtl@title}}%
\else
\def\indtl@maybeaddtotoc{}%
\fi
\ifx\indtl@title\indtl@check@indexname\else
\def\indexname{\indtl@title}%
\fi
\@input@{#1.ind}
\let\indexname\indtl@indexname % restore \indexname
}
\makeatother
\makeindex
\begin{document}
Blablabla\index{index1}
\newpage
\printindex
\newpage
Blablabla\index{index2}
\end{document}