I tried this too printing the monitorable
property every frame, and you can actually see what's happening in the system console:
True
True
Entered
ERROR: Function blocked during in/out signal. Use set_deferred("monitorable", true/false).
At: scene/2d/area_2d.cpp:424
True
True
It's a bit unintuitive, but the reason monitorable
cannot be changed from within the signal handler is because the area is currently doing the monitoring, that state cannot be changed until it's done doing it.
So you may want to do this instead:
set_deferred("monitorable", false)