M создаются при блокировке в системном вызове (syscall): текущий M блокируется, рантайм может создать новый M для привязки к освободившемуся P и продолжения выполнения горутин. После возврата из syscall старый M может вернуться в пул. Поэтому число M не ограничено числом P.