Try stopping your iteration
on the Recursive block
of your CTE instead of doing it outside, my guess is if you stop it while SQL is trying to build it (inside the recursive block) it wont get into a infinite loop
WITH Result AS
(SELECT HOLDER_CO_ID,
HELD_CO_ID,
PCT_OWNED,
1 AS generationsremoved
FROM dbo.ALL_HOLDING_INFO
UNION ALL
SELECT P.HOLDER_CO_ID,
N.HELD_CO_ID,
P.PCT_OWNED * N.PCT_OWNED AS Expr1,
P.generationsremoved + 1 AS Expr2
FROM Result AS P INNER JOIN
dbo.ALL_HOLDING_INFO AS N ON P.HELD_CO_ID = N.HOLDER_CO_ID
WHERE (P.generationsremoved<= 10)
AND (PCT_OWNED > 0.005))
SELECT DISTINCT TOP (100) PERCENT HOLDER_CO_ID,
HELD_CO_ID,
PCT_OWNED,
generationsremoved
FROM Result AS Result_1