I found the solution which is probably quite basic for experienced WP developers. I’m gonna post it here instead of deleting the question though, I hope this might help someone someday…
The issue was that the post data wasn’t reset, so all I needed is to add a function call wp_reset_postdata();
after my while loop. Like so:
$crosssell_ids = get_post_meta( get_the_ID(), '_crosssell_ids' );
$crosssell_ids = $crosssell_ids[0];
if(count($crosssell_ids) > 0) {
$crosssell_args = array( 'post_type' => 'product', 'posts_per_page' => 8, 'post__in' => $crosssell_ids );
$crosssell_loop = new WP_Query( $crosssell_args );
echo '<div class="products"><div class="tabs-title">Consumables for <br>«' . get_the_title($product->id) . '»</div>';
while ( $crosssell_loop->have_posts() ) {
$crosssell_loop->the_post();
wc_get_template_part( 'content', 'product' );
};
wp_reset_postdata();
echo '</div>';
}