> I suspect condition (2) is  killer. While assuming "{" is catcode 1 is
> fine for LaTeX-like input, what happens if you're using LaTeX3 with some
> other input syntax (for example XML)?

Ok, the code can be changed so that the condition becomes

(2') There is only one character with catcode 1, and it is known when
the package is loaded.

Would it be enough? It could even be relaxed very slightly. But
something that definitely cannot be coped with entirely robustly is
having two catcode 1 characters at the same time (except if there is
no catcode 2 character ^^): the following unbraces its argument.

\catcode$$=1\relax \catcode$$=2\relax
\def\UntilBrace#1#{\def\a{#1}\show\a}
\UntilBrace((abc)){}
\UntilBrace(abc){}
\UntilBrace abc{}

--
Bruno