Just to check I understood your question, you want to display child posts under each parent post?
In that case you have to write one more WP_Query
inside your while
loop, with parent as current post in loop.
Something like:
if ($query->have_posts()) :
?>
<?php while ($query->have_posts()) : $query->the_post();
?>
<div class="col-md-3 col-sm-6 wow fadeInRight">
<div class="products_cat">
<div class="img_cls">
<?php
if (has_post_thumbnail()) {
the_post_thumbnail('full');
}?>
</div>
<div class="clearfix"></div>
<h2 class="title"><a href="https://wordpress.stackexchange.com/questions/255628/<?php the_permalink(); ?>"><?php the_title(); ?></h2>
</div>
</div>
<?php
endwhile;
wp_reset_postdata();
?>
Edit:
Make a file single-products.php and add
$child_query = new WP_Query(array('post_type' => 'products', 'post_parent' => get_the_ID(), 'posts_per_page' => '-1'));
while ($child_query ->have_posts()) : $child_query ->the_post();
?>
<div class="col-md-3 col-sm-6 wow fadeInRight">
<div class="products_cat">
<div class="img_cls">
<?php
if (has_post_thumbnail()) {
the_post_thumbnail('full');
}?>
</div>
<div class="clearfix"></div>
<h2 class="title"><a href="https://wordpress.stackexchange.com/questions/255628/<?php the_permalink(); ?>"><?php the_title(); ?></h2>
</div>
</div>
<?php
endwhile;
Please check syntax errors and add necessary code which haven’t specified. Sorry I lost track of indentations after so many edits.