By using yield return new WaitForEndOfFrame();
in your coroutine, you are pausing the coroutine until the camera and UI rendering is done - after which you can safely download the results from your render target.
For doing instanced drawing in 2022.1, there is now the new BatchRenderGroup API that lets you set each batch’s mesh/material and constant buffers - and record the drawing commands for instanced drawing:
It appears to be more efficient, and you can use jobs for multithreading the process.
It requires using the SRP batcher with either URP/HDRP - and does not support OpenGL/GLES and WebGL.
I found this forum post very useful:
If using built-in render pipeline, or older version of Unity, then Graphics.DrawMeshInstanced (which you are using) seems like the way to go.