This is because you can only Instantiate a GameObject on unity's main thread and the message you receive calls your handler code on an async thread.
I would recommend looking at the UnityMainThreadDispatcher package to help with this.
A simple but less efficient method to fix this would be to have a bool that is set true in your handler. Then in update function if that bool is true, Instantiate your GameObject.
void Start()
{
EventHandler<MsgHandlerEventArgs> handler = (sender, args) =>
{
messageReceived = true;
};
// Update is called once per frame
void Update()
{
if(messageReceived)
// create object
}