My workaround is to add a preprocessing step. I have, essentially, this:
public message_c: string;
public message: DialogueBox; // text, scroll speed, colors, etc.; doesn't show in scene editor
awake() {
if (!this.message && !!this.message_c) {
this.message = new DialogueBox(this.message_c.replace('\\n', '\n'));
}
}
This way you can also define your own control codes. For instance, I have one for "make the dialogue box appear all at once rather than scrolling", and another for "split message into multiple dialogue boxes". You should find it pretty straightforward.