I couldn't find any other way as well. So it seems like adding the null check on next dialog will do the job. I prefer to emit a signal instead of using Global Variable
Code inside example_ballon.gd
var dialogue_line: DialogueLine:
set(next_dialogue_line):
if next_dialogue_line == null:
Dialogs.emit_signal("dialog_ended")
Dialogs is a singleton class, so I can hook up this signal anywhere I want which also helps me make co-routine easily