Yeah, there is always a level. A main menu is just a camera in a scene of decorations (or an empty void) with 2D elements atop it.
When you want to spawn users into “the actual game”, you would write any persistent data to their GameInstance and force them to into a different map (although this can be done in multiple ways).
I’m a bit unclear about your game idea, though. Can there be multiple 1v1 matches at the same time? Or is it just a single 1v1 match, and everyone else spectates?
Either way is doable, but each way is very different from the others. Specifically, simultaneous matches requires that the main menu map sends users to a completely different server, where the game map is loaded. (You can technically also have the main menu level be the game level, but that’s a lot of weird work. GameMode, GameState, etc. would apply to all current matches and the menu… and, then, your level can only be so large, so there’s only so many play areas you can spawn in it, etc. Basically, don’t do that.)
Single matches, one at a time and everyone else spectates, can be done by "ServerTravel"ing between the menu map and the game map, back and forth, over and over, where two people are players and everyone else are spectators.
Again, if you want to persist data between levels, like RTS spawn locations, team colors, etc., you will need to write it to your subclass of GameInstance. Basically everything else is flushed when a level is changed.
(There are some exceptions with “Seamless Travel”, but it has heavy restrictions, like the GameMode cannot change.)