Fastest way to determine size of groups of FILESTREAM objects
Don't know if its the fastest but I grouped the Filestream column into batches of 5000 rows then calculated each batch size before creating a running total:

CREATE PROCEDURE CalculateFSSize @RowCnt
AS

BEGIN

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'FSSizeBatch' AND TABLE_SCHEMA = 'dbo')
DROP TABLE dbo.FSSizeBatch

CREATE TABLE FSSizeBatch(BatchID INT
                                ,StartID INT
                                ,EndID INT
                                ,BatchCnt INT
                                ,BatchSize DECIMAL(18,4)
                                ,RunningTotal DECIMAL(18,4))

DECLARE @BatchID INT
    ,@StartID INT
    ,@EndID INT
    ,@BatchCnt INT

DECLARE cur_1 CURSOR FOR   

    SELECT ((Rank - 1) / @RowCnt) + 1 AS BatchID
            ,MIN(ID) AS StartID
            ,MAX(ID) AS EndID
            ,COUNT(*) AS BatchCnt
    FROM (
        SELECT RANK() OVER (ORDER BY ID) Rank
            ,ID
        FROM [dbo].[FS]
        ) T
    GROUP BY ((Rank - 1) / @RowCnt) + 1
    ORDER BY BatchID

OPEN cur_1  
FETCH NEXT FROM cur_1 INTO @BatchID, @StartID, @EndID, @BatchCnt  

WHILE @@FETCH_STATUS = 0  
BEGIN  

INSERT INTO FSSizeBatch(BatchID, StartID, EndID, BatchCnt, BatchSize)

SELECT @BatchID
        ,@StartID
        ,@EndID
        ,@BatchCnt
        ,SUM(CAST(DATALENGTH([JSONDATA]) + DATALENGTH([ZIPDATA]) AS DECIMAL)/1024/1014 )
FROM [dbo].[FS]
WHERE ID BETWEEN @StartID AND @EndID       

  FETCH NEXT FROM cur_1 INTO @BatchID, @StartID, @EndID, @BatchCnt   
END 

CLOSE cur_1  
DEALLOCATE cur_1  

;WITH a AS (
        SELECT BatchID, RunningTotal, SUM(BatchSize) OVER(ORDER BY BatchID ROWS UNBOUNDED PRECEDING) AS RowTotal
        FROM FSSizeBatch
        )
UPDATE a
SET RunningTotal = RowTotal

SELECT *
FROM FSSizeBatch

END