WordPress использует base в урл чтобы определять, что это за тип контента и какой запрос выполнять. Поэтому один и тот же base для разных типов - не вариант. Дело в том, что ваш красивый урл для него выглядит вот так:
/products/sample-product/ - урл для человека
/products/([^/]+)(?:/([0-9]+))?/?$ - правило, по которому WP его парсит
index.php?product=sample-product&post_type=product&name=sample-product - вот во что он превращается для ядра
Как видите, в результирующем "машинном" урл запрашивается post_type, там нет ничего связанного с категориями продуктов, соответственно по ним ничего искаться и не будет, отсюда 404.
Также, важно понимать, что rewrite rules в WordPress идут массивом, одно за другим, и он их в таком порядке проверяет. Первое, которое подошло сработает, и дальнейшая проверка прекращается. Поэтому, если у вас 2 разных правила на 1 урл base, срабатывать будет то, которое в массиве правил стоит первым. До второго очередь просто не дойдет.
Вообще, по логике, структура url должна быть:
/products/ - все продукты
/products/category/{category-name} - категория продуктов
/product/{product-name} - один продукт
А хотелки клиента надо иногда контролировать.