Instead of include(), use get_template_part()
https://developer.wordpress.org/reference/functions/get_template_part/
<?php
$post = $wp_query->post;
if (cat_is_ancestor_of( 42, $cat ) ) {
get_template_part( 'services', 'template' )
} else {
get_template_part( 'single', 'default' );
}
?>
If you create those files and use get_template_part(), then within those files you can set them up to display posts however you see fit. Take a look at the Underscores theme on github, the archive.php file has a good example of using get_template_part() within the loop –
https://github.com/Automattic/_s/blob/master/archive.php
Here is a link as well to one of the template_parts for Underscores to see how they set it up within that file –
https://github.com/Automattic/_s/blob/master/template-parts/content.php
Tom Mcfarlin explains this extremely well here –
Response to your edits: Your single-{CPT-slug}.php templates should not cause any issues with this.