Unable to get post content from custom post type loop

As other answers mentioned, you aren’t in The Loop so get_the_*() functions aren’t going to work properly. Since you’re looping over $query->get_posts() you can just use the WP_Post object.

Something like this will work.

foreach($query->get_posts() as $testimonial):
    $meta = get_post_meta($testimonial->ID);
    foreach($meta as &$m){
            if(is_array($m)){
                $m = $m[0];
            }
        }

    <div class="content"><?= do_shortcode($testimonial->post_content); ?></div>
    <div class="author">- <?=$testimonial->post_title; ?> / <span class="company_name"><?=$meta['_testimonial_company_name'] ?></span></div>
    <div class="link"><a href="https://wordpress.stackexchange.com/questions/277872/<?=home_url("/testimonials'); ?>" title="View All Testimonials">View More</a></div>            

<?php endforeach;?>

Depending on your specific situation you may want to wpautop() the content as well. E.g. do_shortcode(wpautop($testimonial->post_content))

If you want to setup a secondary loop, you can; however, you should NOT use setup_postdata() unless you are sure that you aren’t working in a nested loop since that modifies the global post object.