I'm not sure the perf/battery life tradeoff is a necessary aspect of immediate mode UI.
while (running) {
event := get_next_event()
process_event(event)
repaint()
}
You could just have get_next_event block until there is a meaningful event that occurs (e.g. mouse click). You could even have your UI report "interactive" rectangles to the event layer to prevent it from producing e.g. mouse move events that are irrelevant.
IMGUI is just a different API design IMO.