Acho que isso pode lhe dar o que você está procurando:
;WITH
weekcounts AS (
SELECT Time_Stamp, Emp_ID, [Balance], ROUND(CONVERT(FLOAT,[Balance]) / 60.0,2) AS [Hours], DATEPART(week, Time_Stamp) AS int_week FROM newSampleData
)
,counts AS (
SELECT Emp_ID, int_week, 1 AS int_count
FROM weekcounts
WHERE ([Hours] >= 7.5)
UNION ALL
SELECT weekcounts.Emp_ID, weekcounts.int_week, 1 AS int_count
FROM weekcounts
INNER JOIN counts
ON weekcounts.Emp_ID = counts.Emp_ID
AND (weekcounts.int_week - 1) = counts.int_week
AND ([Hours] >= 7.5)
)
,countsagg AS (
SELECT Emp_ID, int_week, SUM(int_count) AS int_count
FROM counts
GROUP BY Emp_ID, int_week
)
SELECT Emp_ID,
ISNULL([29],0) AS [week 29],
ISNULL([30],0) AS [week 30],
ISNULL([31],0) AS [week 31],
ISNULL([32],0) AS [week 32],
ISNULL([33],0) AS [week 33]
FROM countsagg
PIVOT (MAX(int_count) FOR int_week IN ([29],[30],[31],[32],[33])) piv
Além disso, se o Balance for um varchar, você está fazendo mais conversões do que o necessário em seu código fornecido. Isso dará o resultado para horas com menos código:
ROUND(CONVERT(FLOAT,[Balance]) / 60.0,2)