I have found that you need to allow 25px in between tables in order to prevent Outlook from stacking them like that.
The other solution is to use conditional code for Outlook to wrap each table in a cell of a wrapper table. This means that in Outlook they'll both be on the same row of a table so they can't possibly bump down.
<!--[if (gte mso 9)|(IE)]>
<table width="640" cellpadding="0" cellspacing="0" border="0">
<tr>
<td width="50%">
<![endif]-->
(Left table goes here)
<!--[if (gte mso 9)|(IE)]>
</td>
<td width="50%">
<![endif]-->
(Right table goes here)
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
The (gte mso 9)
will target all versions of Outlook 2000 and up, but in actual fact Outlook 2000, 2002 and 2003 render using IE and don't recognise that code, which is why you also use (IE)
in the conditional if statement.