В этой таблице много записей? Вы уверены, что в обоих случаях затронуты правильные строки? Вы пытались использовать SET TRANSACTION ISOLATION LEVEL вместо ввода отдельных подсказок в запросе?
UPDATE tt SET
col1 = NULLIF(c1.RowCnt, 0),
col2 = NULLIF(c2.RowCnt, 0)
FROM dbo.TargetTable AS tt
INNER JOIN
(
SELECT col3, RowCnt = COUNT(*)
FROM dbo.Table2 WITH (NOLOCK)
GROUP BY col3
) AS c1 ON c1.col3 = tt.ID
INNER JOIN
(
SELECT col4, RowCnt = COUNT(*)
FROM dbo.Table2 WITH (NOLOCK)
GROUP BY col4
) AS c2 ON c2.col4 = tt.ID
WHERE tt.[timestamp] BETWEEN @FromDate AND @ToDate
AND tt.Client_ID = @Client_ID;
-- with SQL Server's UPDATE FROM syntax, you should reference the alias in the UPDATE
-- use WITH (NOLOCK), as your current syntax could become an alias in later versions
-- get in the habit of using dbo. prefix and statement terminators
-- are you sure you don't want left joins?