Ничего не поделаешь. Запуск SP внутри курсора l oop - это совсем НЕ то, как вы это делаете, и это сделает все очень медленно, но вы, по вашим собственным словам, не можете изменить этот факт.
Учитывая, что вы иметь один идентификатор и что выход также определен - это столь же простой оператор выбора, как и получаемый, и вы ничего не можете оптимизировать в этом коде. Очевидно, что должен быть индекс по обоим соответствующим полям (th.ProductID, th.ReferenceOrderID и soh.SalesOrderID), но опять же, это не часть запроса (но ошибка, которую я обычно видел часто).
Суть в том, что наличие этого SP внутри al oop - это то, что делает его медленным, а не маленький код, который у вас есть.