So I'm calling Render on my cameras manually because I need more control over them. However, I noticed that this does nothing in Update or LateUpdate. It does work in OnGUI, but then OnGUI is called multiple times a frame resulting in multiple renders. I can take care of this by having a "hasRendered" flag, but it all begs the question of when Camera.Render is supposed to be called in the first place. The documentation makes no mention of when it should be called.
Here's my understanding: you can call it pretty much whenever you want -- that is, from any code that's executing when you want to draw stuff -- but you should remember to disable the camera so that it isn't also rendered by the Unity framework.
If you didn't disable the camera, then it may have appeared that it was doing nothing in Update or LateUpdate because your manual rendering was subsequently overdrawn with the framework's rendering. (Just a guess.)
OnGUI is indeed called multiple times, but you don't need your own flag; you can (and probably should) instead check the event type. Something like this:
if (Event.current.type == EventType.Repaint) cam.Render();
OnGUI will also get called for other event types, like EventType.Layout, that you probably don't care about.