Does glUniformMatrix4fv instantly copy data pointed to by the passed in pointer? If not when does it make the copy? Would it be the glDrawElements or glDrawArrays call?
The same time as any pointer data you give OpenGL (unless the function explicitly states otherwise): immediately.
Indeed, the only exceptions are the attribute pointer functions when using client memory. Other than that, every function immediately does its copy when given client memory.