A little more investigation reveals that it seems that the key thing is actually setting a breakpoint and stepping over the line:
__weak NSOpenPanel *openPanel = [NSOpenPanel openPanel];
in the debugger. If I continue after that line, I get the panel, and otherwise do not, with a silent failure.
I've found a couple of other discussions which seem to say that Catalina (at least beta versions) treated all open panels as sandboxed, even if the app isn't, but I can't see the specific errors that are reported in those discussions (with XPC).