Custom taxonomy query showing more than 4 posts

This is why code indentation is so important! Your posts_per_page argument is actually part of your tax_query:

'post_type' => 'regularproducts',
'tax_query' => array(
    array(
        'taxonomy' => 'products-category',
        'field' => 'slug',
        'terms' => $course_terms, //the taxonomy terms I'd like to dynamically query
        'posts_per_page' => '4'
    ),
),
'orderby' => 'title',

Instead, you should have:

$wp_query = new WP_Query(
    array(
        'posts_per_page' => '4',
        'post_type' => 'regularproducts',
        'tax_query' => array(
            array(
                'taxonomy' => 'products-category',
                'field' => 'slug',
                'terms' => $course_terms, //the taxonomy terms I'd like to dynamically query
            ),
        ),
        'orderby' => 'title',
        'order' => 'ASC',
    )
);