Как я понимаю, основная проблема в наименее затратном формировании строки списка подкатегорий ?
Если есть ограничение на максимально возможное количество категорий у товара, то самый простой вариант, наверное, формировать полный список категорий в одном SQL запросе, связывая JOIN-ами таблицу категорий саму с собой необходимое кол-во раз. Если же нет, то можно рассмотреть, например, способ хранения иерархических данных в БД, имеющий название materialized path. Там, конечно, есть свои сложности с добавлением и переносом поддеревьев внутри дерева, но зато формирование списка категорий будет выполняться очень просто. На хабре в свое время, вроде бы, была обзорная статья по способам хранения иерархических данных в реляционных БД.