Your second loop example is flawed. You will never want to write code like that because there are many common parts of your game that must run on each main loop iteration. More likely you'd end up with something like:
else if is_night:
Only one loop. Your logic is split into functions that handle a single iteration of loop.
You could consider using a Finite State Machine in place of the explicit conditions. Each of your special loops could be a single state. Every state has some code that is run each iteration of your game loop, let's call it update. Each State also has a way to transition to another state, which is the check you speak of.
You can organize your code such that these checks are in their own methods on each state object. E.g., your DayState might be (in pseudocode):
// do your day loop code here once; Update is itself called in a loop
return new NightState
Now on each iteration of your loop, the current state's Update is called, then NewState is called, and if it returns a new state, the state is switched. You can also then add method for transitions so special code can run when Day ends or Night begins and so on.
new_state = current_state->NewState()
if new_state is not nil:
current_state = new_state
You can now add new states and transitions much easier than with a bunch of hard-wired conditions everywhere.
A second approach (which can be combined with the first) is to use events. If you have some other system which is tracking time of day, it will know when day transitions to night. It can emit a "EndDay" event that interested systems listen to. You will probably find that your main loops for day/night are very similar and that only some specific systems will change, e.g. maybe your MonsterSpawner changes what monsters it spawns. If it listens for EndDay and EndNight, it can change its active list of monsters to spawn from when it receives the event and doesn't need to check each loop iteration.
// might cause things to happen in other systems via events
// uses current state to decide what to spawn
In general, though, if you're just checking a few conditions each iteration of you main loop, you're fine. Your only worry should be whether the code is easy to understand and modify. There's no reason to be afraid of if-checks at such top-level code (doing an if-check inside some inner loop run 100,000 times per frame is another story).
Without knowing specifically what you're doing, I would suggest keeping the single loop and just put if-checks where the behavior needs to change. Making multiple loops is likely just going to result in a lot of redundant code for no real gain. Split your code up into logical modules to start and see how much flexibility that gains you.