get_the_category return empty inside loop

The problem is here:

    switch_to_blog($subsite_id);
    $blog_posts = get_posts(); 
    restore_current_blog();
    foreach( $blog_posts as $post ) {
        setup_postdata( $post );
        get_template_part( 'theme-partials/post-templates/loop-content/masonry' );
    }

Your code fetches a number of posts, but then you switch back to the original blog! So now post number 5 means something completely different than it did before.

You need to stay in that other blogs context for as long as you’re working with that blogs data, or all the references will be incorrect. Once you restore the original blog you can’t use that data.

Additionally, switching to another blog just changes the data that comes back, it won’t load in plugins and code. This means only the filters, taxonomies, post types of the original blog are loaded.