I was able to resolve this with the following code which generates rewrite_rules for each subcategory, which is preferred during matching since it’s more specific:
function wpse_291143_generate_taxonomy_rewrite_rules( $wp_rewrite ) {
global $wp_rewrite;
$base = "shop";
$rules = array();
$terms = get_terms( array( 'taxonomy' => 'product_cat', 'hide_empty' => false ));
foreach($terms as $term) {
$term_children = get_terms( array(
'taxonomy' => 'product_cat',
'parent' => intval($term->term_id),
'hide_empty' => false
)
);
if($term_children) {
foreach ( $term_children as $term_child ) {
$rules[$base . "https://wordpress.stackexchange.com/" . $term->slug . "https://wordpress.stackexchange.com/" . $term_child->slug . '/?$'] = 'index.php?product_cat=" . $term_child->slug;
}
}
}
$wp_rewrite->rules = $rules + $wp_rewrite->rules;
return $wp_rewrite->rules;
}
add_action("generate_rewrite_rules', 'wpse_291143_generate_taxonomy_rewrite_rules');