Pass multiple sets of variables to theme function
And, the general rule of "post a question and that helps you figure it out yourself" applies here yet again.

All I did was modify my theme hook like so:

/**
 * Implements hook_theme().
 */
function my_module_theme($existing, $type, $theme, $path) {
  return array(
    'my-module-mail' =&gt; array(
      'variables' =&gt; array(
        'openings' =&gt; array(
          'service_name' =&gt; NULL,
          'time' =&gt; NULL,
          'therapist' =&gt; NULL,
          'booking_link' =&gt; NULL,
        ),
      ),
      'template' =&gt; 'templates/my-module-mail',
    ),
  );
}


and fill my $variables array like so:

  // Loop through all openings for this category.
    foreach ($available_openings[$tid['tid']] as $mail_opening) {
      $variables['openings'][] = $mail_opening;
    }
    $body = theme('my_module_mail', $variables);
    // Define mail parameters.
    $params = array(
      'subject' =&gt; t('Your Available Openings'),
      'body' =&gt; $body,
    );
    // Send the mail.
    drupal_mail('my-module-mail', 'featured_openings', $entity-&gt;mail, language_default(), $params);


and it works like a charm.