Messages sometimes pass pointers to memory buffers in their parameters. If you send a memory address as-is from one process to another, the address will not have the same meaning in the receiving process.
For system messages, like WM_SETTEXT and WM_COPYDATA for example, the OS knows how to work with the memory buffers for those messages. When sending such a message across processes, the OS automatically allocates an appropriate memory buffer in the receiving process and fills it with a copy of the original data. The message parameters are then adjusted to point at the new memory address accordingly before the message is delivered to the target message handler.
For custom messages that contain pointers, the OS cannot automatically marshal the data for you, so you have to perform your own custom marshaling.
That is what message marshaling is about. Copying externally-referenced data from one process to another in a safe way so that any pointers in the message make sense within the address space of the receiving process.