そのFORMAT_HTMLでfullmessageに入れるか,fullmessagehtmlに入れるかを分けるのは正しい動作です.
メッセージはデータベースにまず預けられて,それから一定時間,相手のユーザがアクセスしてこない場合は電子メールで送信します.これはcron.phpから実行されます.途中のplugin云々は追い切れなかったのですが,最終的には,moodle/message/output/email/message_output_email.phpの61行目辺り,class message_output_email のfunction send_message()で送信されるのだと思います.
$result = email_to_user($recipient, $eventdata->userfrom, $eventdata->subject, $eventdata->fullmessage, $eventdata->fullmessagehtml);
このように,email_to_user()には,プレインテキスト形式のメール本文を受け取る引数(fullmessage)とHTML形式のメール本文を受け取る引数(fullmessagehtml)が最初から用意されています.実際にはどちらか一方のみがデータが入っていて,もう一方はnullでしょう.
このemail_to_user()関数の中で,次はメールを受け取る側のユーザのメーラのタイプ(プレインテキストかHTML形式OKか)を見て,HTML→プレインテキストの変換やその逆を行います.
cronで起動する関数のデバッグは面倒ですね.一番効果的なのは,email_to_user()にデバッグのコードを仕掛けることです.この関数の入り口で$messagetext, $messagehtmlの引数の値をテキストファイルに出力してログを取る.でもこれは気を付けないと自分が送ったメッセージ以外のものも拾ってしまうかも知れません.Moodleをメンテナンスモードに変更してユーザがログインできない状態にした上で,(できれば30分以上,放置してから)実験を行う必要があるでしょう.
しかし不思議ですね.ちなみにユーザプロファイルの”メール文字コード”はISO-2022-JP”ですよね? 送信側も受信側も.