buenas,
curioso que te funcione con alert pero no con tu función. de hecho, no te debería funcionar en ninguna circunstancia. la razón es porque el navegador hace un cierre prematuro del entorno de scripting. no porque el navegador sea ineficiente, sino por como analiza los tags. específicamente el navegador considera la siguiente porción como scripting.
Código:
<script>
escritorio.agregar("<script>var ventana"+app+" = new ventana('"+app+"','"+data+"');</script>","body");
</script>
es decir, va desde el primer <script> hasta la primera coincidencia de </script>. ¿qué debes hacer? cualquier cosa en que sintácticamente el navegador no pueda analizarlo como un tag. por ejemplo, dividir la secuencia
script en otro string... "</scri" + "pt>". o bien substituir algún caracter en su equivalente hexadecimal... "</\x73cript>". el más fácil, escapa el caracter slash... "<\/script>". reitero, no tienes que usar todas esas alternativas, solo una de ella.