This is actually a complicated long discussion.
In a perfect world each MX WAN1 would be connected to the same upstream circuit, ditto with WAN2. So each MX would have 2 IP addresses on each uplink. Additional their would be a third VIP (or cluster address if you prefer) on each circuit, giving a total of three IP addresses per uplink.
When you have a virtual IP configured all outbound traffic goes out NATed from that IP address. Also all VPNs are built from that address. So when you have a failover it is quick.
If you don't have a virtual IP then the traffic goes out using the IP address of the current active MX. Ditto for VPNs. If you have a failover VPNs have to be re-established using the IP address of the standby MX. Ditto for web browsing traffic.
Overall in most cases - this is not a big deal. The VPNs usually rebuild quickly, and if a user clicks refresh on their web browser (if it failed right in the middle of a session) everything continues on.
I frequently do HA deployments without using a VIP address.
Now the more complicated case. The MX's don't even need to be plugged into the same uplinks. You could plug WAN1 of MX1 into uplink1 and WAN1 of MX2 into uplink2. You might do this if you can only get PPPoE circuits, or some other kind of circuit where you strictly can not get a /29 of address space or more.
What happens is uplink2 can only be used if uplink1 has failed or the primary MX has failed.
You obviously can't use virtual IP in this case, because the WAN1 interface of each MX is not connected to the same subnet.
The failover cases are the same as when not using a VIP as above. Each MX simply uses the address assigned to its WAN interface when it is active.
So you actually have a lot of deployment scenarios that can be handled.