Add the following code in functions.php:

/* Exclude products in the promo category on the shop page */
function custom_pre_get_posts_query( $q ) {
    $tax_query = (array) $q->get( 'tax_query' );
    $tax_query[] = array(
           'taxonomy' => 'product_cat',
           'field' => 'slug',
           'terms' => array( 'clothing' ), // Don't display products in the clothing category on the shop page.
           'operator' => 'NOT IN'
    $q->set( 'tax_query', $tax_query );
add_action( 'woocommerce_product_query', 'custom_pre_get_posts_query' );

Edit name of category as needed.

Products will also be hidden in search. If you want to display the products in search, the easiest solution is to set the products “catalogue visibility” to “search results only” and use a shortcode to display the products on another page. The shortcode must contain “visibility=search”. Here is an example of shortcode:

[products category=category_name columns=3 visibility=search]