Your best bet is not to run a bunch of queries but to loop through your data once to organize it then a second time to display it. Below is the logic you need. The exact code will depend on your data set.
$events = array();
$posts = WP_Query( $args );
foreach ( $posts as $post ) {
$venue = $post->venue;
$day_of_month = date( 'd', $post->date );
$events[ $venue ][ $day_of_month ][] = $post;
}
for ( $x = 1; $x <= 31; $x ++ ) {
foreach ( $events as $venue => $ev ) {
if ( ! empty( $ev[ $x ] ) {
echo '<td>';
foreach ( $ev[ $x ] as $details ) {
echo $details;
}
echo '</td>';
}
}
}