Два синтаксиса служат разным целям. Использование синтаксиса Join предполагает, что вы хотите что-то из таблиц StockToCategory и Category. Если в таблице StockToCategory имеется несколько записей для каждой категории, значения таблицы Category будут повторяться.
Использование функции IN предполагает, что вам нужны только элементы из категории, чей идентификатор соответствует некоторым критериям. Если заданный CategoryId (при условии, что это PK таблицы категорий) существует несколько раз в таблице StockToCategory, он будет возвращен только один раз.
В вашем конкретном примере они будут выдавать один и тот же вывод, однако IMO, более поздний синтаксис делает ваше намерение (только для категорий) более ясным.
Кстати, третий синтаксис, аналогичный использованию функции IN:
Select ...
From Category
Where Exists (
Select 1
From StockToCategory
Where StockToCategory.CategoryId = Category.CategoryId
And StockToCategory.Stock = @StockId
)