Making certain categories of CPT not publicly queryable

Sounds like you really just need a filter on pre_get_posts to remove the unwanted terms. Something like this, but I am not sure I understand all the conditions you need so think of it as proof of concept only.

function exclude_terms_wpse_117242($qry) {
  if (is_user_logged_in()) {
    $tq = array(
        array(
            'taxonomy' => 'your_tax',
            'field' => 'id',
            'terms' => array(1,2,3),
            'operator' => 'NOT IN',
        )
    );
    $qry->set('tax_query',$tq);
  }
}
add_action('pre_get_posts','exclude_terms_wpse_117242');