I'd like to propose another way. You can run through all the column and table names by using a CURSOR. That way you don't need to store them beforehand and can directly access them in your loop while also having a while condition.
Also I went with sys.tables and sys.columns since I noticed that INFORMATION_SCHEMA also contains views and sys.tables can be filtered for the table's type.
I added a "HAVING COUNT(*) >= 5" into the dynamic SQL so I don't save those informations in the first place rather than filtering them later.
Finally I went with "(NOLOCK)" because you only try to acces the tables for reading and that way you don't lock them for other users / interactions.
(The @i and @max are just for tracking the progress since I ran the query on ~10k columns and just wanted to see how far it is.)
Hopefully might be helpful aswell although you seem to have solved your problem.
DECLARE @columnName nvarchar(100),
    @tableName nvarchar(100),
    @sql nvarchar(MAX),
    @i int = 0,
    @max int = (SELECT COUNT(*)
                FROM sys.tables T
                INNER JOIN sys.columns C ON T.object_id = C.object_id
                WHERE T.[type] = 'U')
DROP TABLE IF EXISTS #resultTable
CREATE TABLE #resultTable (ColumnName nvarchar(100), TableName nvarchar(100), ResultCount int)
DECLARE db_cursor CURSOR FOR
SELECT C.[name], T.[name]
FROM sys.tables T
INNER JOIN sys.columns C ON T.object_id = C.object_id
WHERE T.[type] = 'U'
OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @columnName, @tableName
WHILE @@FETCH_STATUS = 0  
BEGIN  
    SET @sql = CONCAT(' INSERT INTO #resultTable (ColumnName, TableName, ResultCount)
                        SELECT ''', @columnName, ''', ''', @tableName, ''', COUNT(*)
                        FROM (
                            SELECT DISTINCT [', @columnName, ']
                            FROM [', @tableName, '] (NOLOCK)
                            WHERE [', @columnName, '] IS NOT NULL
                        ) t
                        HAVING COUNT(*) >= 5')
    EXEC sp_executesql @sql
    SET @i = @i + 1
    PRINT CONCAT(@i, ' / ', @max)
    FETCH NEXT FROM db_cursor INTO @columnName, @tableName
END 
CLOSE db_cursor  
DEALLOCATE db_cursor 
SELECT *
FROM #resultTable