Try this, use start and end values and increment it in batches
DECLARE @Batch  INT
        ,@StartId BIGINT
        ,@EndId BIGINT
        ,@r     INT
SELECT  @Batch  = 10000
        ,@StartId = 1
        ,@EndId = 0
        ,@r     = 1
WHILE @r > 0
BEGIN 
    SET @StartId = @EndId + 1
    SET @EndId = @EndId + @Batch
    UPDATE d
        SET col = dd.col
        FROM doc.Document d 
        INNER JOIN @documents dd ON d.id = dd.id
            AND dd.id BETWEEN @StartId AND @EndId
    SET @r = @@ROWCOUNT
END
above approach work only when you have ids in sequence, otherwise use this approach to generate batches beforehand and use it, this will make sure that each time 10000 record get updated.
DECLARE @Batch  INT
        ,@StartId BIGINT
        ,@EndId BIGINT
        ,@Cnt INT
        ,@TotalIds INT
DECLARE @Docs TABLE 
(
        StartId BIGINT, 
        EndId BIGINT, 
        BatchID INT
)
SELECT  @Batch  = 10000
        ,@StartId = 1
        ,@EndId = 0
        ,@Cnt = 1
        ,@TotalIds = 0
;WITH CTE_Docs AS
(   SELECT TOP (100) PERCENT id, ROW_NUMBER() OVER (ORDER BY id) as RowID   -- Give seq numbers to each row
    FROM @documentIds d 
)       
-- create batches and batch start and end point
INSERT INTO @Docs(StartId, EndId, BatchId ) 
SELECT  MIN(id) StartID, 
        MAX(id) EndID, 
        (RowID/@Batch)+1 AS BatchID             
FROM CTE_Docs 
GROUP BY RowID/@Batch
ORDER BY BatchID
-- get counter to loop through
SELECT @TotalIds = MAX(BatchID)
FROM @Docs
WHILE @Cnt <= @TotalIds BEGIN   
    SELECT  @StartID    = StartID,
            @EndID      = EndID
    FROM @Docs
    WHERE BatchID = @Cnt
    UPDATE d
        SET col = dd.col
        FROM doc.Document d 
        INNER JOIN @documents dd ON d.id = dd.id
            AND dd.id BETWEEN @StartId AND @EndId
    SET @Cnt = @Cnt + 1
END
Hope this helps.