Schau dir Zustandsautomaten an. Da hast du eine Variable die dir angibt in welchem Menu du dich befindest. Diese kann man je nach aktuellem Menü und Eingabe ändern.
In Funktionen bleibt man so nie fest hängen. Je nach Zustand wird eine andere Funktion ausgeführt. Und wenn nichts zu tun ist beendet diese sich sofort wieder.
Dadurch kommt loop() immer wieder gleich dran. Es ist nämlich auch ein Fehler zu denken du springst von Menü zu Menü und am Ende vielleicht einmal nach loop(). Die Bezeichnung loop() darfst du ruhig wörtlich nehmen. Das ist eine Schleife die ständig arbeitet.
Der Vorgang ist eher so:
void loop()
{
if zustand == MENU_1 //praktisch wird hier oft switch/case verwendet
menu_1();
else if zustand == MENU_2
menu_2();
//hier kann man "gleichzeitig" noch andere Dinge tun!
}
void menu_1()
{
if eingabe == ...
zustand = MENU_2;
...
}
Menüs kann man dann nur zum Zeitpunkt des Zustandswechels einmal neu zeichnen