Nel ciclo for la variabile i va dichiarata esplicitamente (ad esempio con var o let) in modo che non diventi globale ma sia resa visibile solo nello scope della funzione per ogni specifica chiamata all'interno del ciclo di ricorsione.
Se questa non viene dichiarata esplicitamente, risulta dichiarata automaticamente a livello globale per cui per ogni ricorsione viene azzerata prima che il corrente ciclo for sia concluso, cioè quando viene eseguita una ricorsione per un successivo livello, in sostanza è come se l'incremento i++ non avvenisse perché la variabile viene comunque azzerata, provocando quindi una ricorsione infinita.
Puoi risolvere aggiungendo semplicemente var:
Probabilmente va rivisto anche il sistema di concatenamento della variabile risultato, da quel che vedo non otteni un albero completo in quel modo.codice:for (var i=0; i<ogg.nodiSub.length; i++)