How do I do this "join"?
I think the easiest option is leave everything as you have it in terms of configuration and your taxonomy term values for main terms. The default Workbench (Moderation) logic isn't nested enough for you. So use it's supported hooks to extend the functionality to meet your needs.

Look at hook_workbench_moderation_access_filter()

/**
 * Allows modules to alter moderation access.
 *
 * @param &amp;$access
 *   A boolean access declaration. Passed by reference.
 * @param $op
 *   The operation being performed. May be 'view', 'update', 'delete',
 *   'view revisions' or 'moderate'.
 * @param $node
 *   The node being acted upon.
 */
function hook_workbench_moderation_access_alter(&amp;$access, $op, $node) {
  global $user;
  // If the node is marked private, only let its owner moderate it.
  if (empty($node-&gt;private) || $op != 'moderate') {
    return;
  }
  if ($user-&gt;uid != $node-&gt;uid) {
    $access = FALSE;
  }
}


By implementing this hook for the node access check, you can define the nested taxonomy check you're wishing Workbench_Moderation did for you. In order to find if some node has a value of a certain parent term you may find the Taxonomy Edge API module useful. Then again you might not need Taxonomy Edge.

I believe the Views workbench uses will also support this runtime check.