You just need to add a missing boolean argument in wp_set_object_terms()
function like:
wp_set_object_terms($post->ID, $term->term_id, 'product_cat', true);
This time the term will be appended and not replaced.
You should check that the term doesn’t exist yet on the product, before appending it like:
add_action( 'transition_post_status', 'new_product_add', 10, 3 );
function new_product_add( $new_status, $old_status, $post ) {
if(
$old_status !== 'publish'
&& $new_status === 'pending'
&& ! empty($post->ID)
&& $post->post_type === 'product'
) {
$taxonomy = 'product_cat';
$term_id = get_term_by( 'name', 'parent_category', $taxonomy )->term_id;
if( ! has_term( $term_id, $taxonomy ) ) {
wp_set_object_terms( $post->ID, $term_id, $taxonomy );
}
}
}