Your code shown here doesn't actually depend on GameObjects - they're just serving as an expensive way for you to store a set of positions. So you could get something equivalent as follows, just using transformation matrices instead:

    // You can assign the default Unity cube here so you have a template mesh to stamp-out.
    public Mesh cubeMesh;

    public static Mesh GenerateChunkMesh(int[,,] map, int chunkSize, Vector3Int chunkPosition)
    {
        // Prep a list of mesh instances to stitch together.
        List<CombineInstance> instances = new List<CombineInstance>();

        // Prepare a "template" object with the attributes we want to apply to each block.
        CombineInstance instance;
        instance.mesh = cubeMesh;

        for (int x = 0; x < chunkSize; x++)
            for (int z = 0; z < chunkSize; z++)
                for (int y = 0; y < chunkSize; y++) {                    
                    Vector3Int cubePosition = chunkPosition + new Vector3Int(x, y, z);

                    // If this part of the map is empty, skip it without making a block.
                    if(map[cubePosition.x, cubePosition.y, cubePosition.z] == 0)
                        continue;

                    // Make a transformation matrix that positions the cube at this location.
                    instance.transform = Matrix4x4.Translate(cubePosition);

                    // Record "I want a cube at this position" in our work list.
                    instances.Add(instance);
                }
            }
        }

        // Build a mesh that combines all of the requested cubes in our work list.
        var mesh = new Mesh();
        mesh.CombineMeshes(combine.ToArray(), true, true);

        return mesh;
    }



But note that this is still rendering more geometry than you need, because you're not eliminating hidden faces. [This answer outlines how you can do that with your own mesh generation routine][1].


  [1]: https://gamedev.stackexchange.com/a/162550/39518