I am trying to implement a function to change state of the menu, but my reference is lost when it leaves the function:
void gotoLowerlevel(Menu *item) {
You're passing the pointer by value.
Operations on the object it points to will be visible to the outside, but the pointer itself is only a copy.
You might want to use a pointer to pointer.