trying to change from query_post to WP_Query

The problem here is caused by variable scope…

Everything is fine, when you use global $wp_query, because it is a global variable and functions like have_posts and the_post are aware of that, so you can use them in template parts.

On the other hand, you define your custom query. Then you get template part and you want to use that variable inside that template – but this variable is not accessible in there because it is not a global variable.

That’s why your way of dividing code into parts is not so common. It would be much better, easier to maintain and more secure, if you’d write it like so:

$args = array(
    'post_type' => APP_POST_TYPE,
    'post_status' => 'publish',
    APP_TAX_STORE => $term->slug,
    'ignore_sticky_posts' => 1,
    'posts_per_page' => -1
));
$query = new WP_Query( $args );
while ( $query->have_posts() ) :
    $query->the_post();
    get_template_part( 'loop', 'coupon' );  // or get_template_part( 'content', 'coupon' );
endwhile;

And in loop-coupon.php should be only the content of single post.

This way you can use the same template part for different loops, so it is easier to re-use.