It won't be slow if you avoid the self join of the CTE, which causes it to go through both tables twice. This will work almost as fast as if you didn't do any formatting.
WITH
cteEnumerate AS
(
SELECT p.Name
,m.Model
,RowNum = ROW_NUMBER() OVER (PARTITION BY p.ID ORDER BY m.Model)
FROM @Products p
JOIN @models m ON p.ID = m.IDProduct
)
SELECT Product = CASE WHEN RowNum > 1 THEN '' ELSE Name END,
Model
FROM cteEnumerate
;
--Jeff Moden
Change is inevitable... Change for the better is not.