При неизвестном кол-ве вложений используй рекурсию.
Код:
procedure AddMenuItem(m:TMenuItem; shift:integer);
var i:integer;
begin
for i:=0 to m.count-1 do
begin
Form1.Memo1.Lines.Add( StringOfChar('-',shift) + t[i].caption );
AddMenuItems( t.items, shift+1 );
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
AddMenuItems( mainmenu1.items, 0 );
end;