Can I query posts by taxonomy conditionally based on post type?

As t31os said, you can’t do that using WP_Query directy.

You can attempt to use the ‘posts_clauses’ filter to modify the individual SQL clauses generated by WP_Query, but it will be quite tricky, however you do it.

Instead, it might be easier to replace the entire SQL query. You can use get_tax_sql() to take care of the taxonomy part (not tested):

function my_posts_request( $old_query, $wp_query ) {
    global $wpdb;

    $ptypes = $wp_query->get('post_type');

    if ( 'page' != $ptypes[2]['post_type'] )
      return $old_query; // This is not the WP_Query you are looking for

    // Do the conditional tax_query
    $tax_query = array(
      array(
        'taxonomy' => 'options',
        'terms' => array( 'set-as-news-item' ),
        'field' => 'slug',
      )
    );

    $clauses = get_tax_sql( $tax_query, $wpdb->posts, 'ID' );

    $join = "FROM $wpdb->posts {$clauses['join']}";
    $where = "WHERE (
      post_type="aucc_publication" OR 
      post_type="aucc_media" OR 
      (post_type="page" {$clauses['where']})
    )";

    // Do the other tax query
    $tax_query = array(
      array(
        'taxonomy' => 'section',
        'terms' => array( 'programs-and-services' ),
        'field' => 'slug',
      ),
      array(
        'taxonomy' => 'regions',
        'terms' => array( 'ghana' ),
        'field' => 'slug',
      )
    );

    $clauses = get_tax_sql( $tax_query, $wpdb->posts, 'ID' );

    $join .= $clauses['join'];
    $where .= $clauses['where'];

    return "SELECT $wpdb->posts.* $join $where ORDER BY post_date LIMIT 10";
}
add_filter( 'posts_request', 'my_posts_request' );

You’ll still have to take care of pagination etc. Take a look at how WP_Query does it.