Adding a Group ID to a query where the sort by is not based on the Column your grouping by
The easiest way in my opinion would be to just add the randomly ordered sequential integer in the SELECT from Product before the join.

WITH Prod
     AS (SELECT *,
                ROW_NUMBER()
                  OVER (ORDER BY CRYPT_GEN_RANDOM(4)) AS ProductGroupID
         FROM   dbo.Products
         WHERE  StudyID = @StudyID
         )
SELECT ProductID,
       QuestionID,
       ProductGroupID
FROM   Prod p
       JOIN dbo.Questions q
         ON p.StudyID = q.StudyID
ORDER  BY ProductGroupID,
          QuestionNumber