Создавать функции внутри функций - плохо, на то есть много причин.
Есть для этих целей класс mx.utils.Delegate он специально предназначен для делегирования (передачи) объекта в области видимости которого будет выполнена функция этой функции.
Кроме того, переделывать ХМЛ в другую структуру, будь то массив или объект - в 99% случаев абсурдное занятие, которое только занимает время и ресурсы. В общем случае, либо используйте так, как есть, либо если очень сложная структура - есть XPath, есть и в mx пакете, и есть альтернативный вариант.
Ну и вот это - ну, как бы вообще не серьезно:

Код:
menu_db.push({ ur:shortcut.childNodes[j].attributes.ur,
caption:shortcut.attributes.name,
link:shortcut.attributes.link,
subnav_db:submenu_db});
Почему нельзя было так?

Код:
menu_db.push(shortcut.childNodes[j].attributes);
Кроме всего прочего, перебирать в цикле ХМЛ таким вот образом:

Код:
while(xml.childNodes[i].childNodes[i].childNodes[i].childNodes[i]...)
Во-первых нечитаемо, а во вторых создает лишнюю нагрузку, т.е. логично в таком случае поступить так:

Код:
var xn:XMLNode = xml.childNodes[i].childNodes[i].childNodes[i].childNodes[i];
while(xn.childNodes[i]...)