Себе сделал так. Вроде работает.
Открываем файл /catalog/model/catalog/product.php
Нам нужно в этом файле найти все p.status = '1' и заменить на p.status = '1' AND p.quantity > '0'
Меняем все, КРОМЕ p.status = '1' в куске $query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, m.image AS mimag бла бла бла (у меня это строка 14). Там оставляем как было. И не забываем почистить кеш после изменений.
Так как использую модуль поиска с морфологией, то пришлось и в нем сделать похожее изменение, чтобы при поиске товара не вываливался товар, которого нет в наличии.
В итоге, товар, которого нет в наличии, по прямой ссылке доступен, в каталоге-подкаталогах его нет, в поиске нет.