One concrete practical reason they shouldn’t is requestAnimationFrame batching.
Right now, if I subscribe to mousemove, I’ll get flooded with events when the user moves the mouse. Each time an event comes in, update runs, potentially changes Model, and potentially runs more effects.
However, regardless of how quickly events are coming in, the Elm Runtime still only calls view once per animation frame - with whatever the current Model happens to be at that moment. It can do this optimization safely because view only returns Html and performs no side effects. Since view cannot possibly do anything other than describe how the page ought to look, it’s always safe to skip running it except when it’s potentially time to change how the page looks.
Now suppose view had the type Model -> ( Html Msg, Cmd Msg ) instead.
In this world,it’s no longer safe to skip calling view under any circumstances. If we get flooded with events, we have to call both update and view on every single event, no matter what. After all, what if view was going to produce an effect on the 14,203rd invocation? There’s no way to know without running it every single time.
That’s is a hefty performance price to pay for being able to have both view and update describe effects directly. 
I’d say there are other design principle reasons to keep them separated, but this is one practical reason. 