Apart from the obvious that there must be a loop unless your application exits immediately … I was pointing out event loops in the sense of something like Windows where you call GetMessage and DispatchMessage and friends, and it does a bunch of black box things just to ultimately call back into your code for the UI element’s window procedure. Or how about HTML, where even the loop is hidden away from the developer? Again, the loop will eventually call back into your code to handle interactions.
With an immediate mode GUI, there are no callbacks (unless you implement them for some reason, maybe a good reason at that?) You also implement the main loop. The major difference is that handling UI interactions takes the form of checking the return value of the function that displays the element. For example, fn do_button(text: &str, x: u32, y: u32) -> bool. If it returns true, the button is being clicked, therefore perform some action.