Check if loop has any categories?

You can just run through the loop and set a flag:

if ( $query->have_posts() ) : 

    $any_in_cat = false; 

    while ( $query->have_posts() ) : $query->the_post();

        if ( in_category( 'first-major' ) ) :
            $any_in_cat = true;
        endif; 

    endwhile;

$query->rewind_posts();

/* if $any_in_cat == true at this point then at least one 
   of the posts has the category 'first-major'
*/

if( true == $any_in_cat ) {
    echo 'true';
} else { 
    echo 'false';
}

I’ve added your conditional check. Note that it is all PHP, so you don’t want the opening and closing tags where you have them in your comment. I prefer the brace notation myself as it suits every case of nested conditionals and is really clear to read. Lastly you need the double-equals sign to test equality. = is the assignment operator, so when you say if ( $any_in_cat = true ) then you are setting $any_in_cat to true and also the condition will always be true. Even if ( $any_in_cat = false ) is true because you are testing the success of the assignment. It’s a slip we all make and is easier to debug if you get in the habit of writing the condition as if( true == $any_in_cat ) Then if you slip and use a single = you’ll get an error message as you can’t make an assignment to true.

You’re re-running your loop several times, so it might be possible to simplify your code somewhat too, but that’s another question and not directly WP related.