> This allows each key to be in exactly one group:
> doing multiple groups is possible but more tricky.

About that (and assuming we'd decided to save the filtered keys), do
you think that just doing

\bool_new:N \l__keys_filtered_bool
\cs_new_protected_nopar:Npn \__keys_set_elt_grouped:
  {
    \cs_if_exist:cT { \c__keys_vars_root_tl \l_keys_path_tl .group }
      {
        \bool_set_false:N \l__keys_filtered_bool
        \clist_if_empty:cTF
          { \c__keys_vars_root_tl \l_keys_path_tl .group }
          { \bool_set_true:N \l__keys_filtered_bool }
          {
            \clist_map_inline:Nn \l__keys_groups_clist
              {
                \clist_map_inline:cn
                  { \c__keys_vars_root_tl \l_keys_path_tl .group }
                  {
                    \tl_if_eq:nnT {##1} {####1}
                      {
                        \bool_set_true:N \l__keys_filtered_bool
                        \clist_map_break:
                      }
                  }
              }
          }
        \bool_if:NTF \l__keys_filtered_bool
          { \__keys_set_elt_aux: }
          { \clist_put_right:Nx \l__keys_filtered_clist { \l_keys_key_tl } }
      }
  }


would be too inefficient?

I think allowing multiple groups could be fairly useful, e.g. because
it makes it easy to implement different grains of filtering by
assigning keys to nested groups. And it's also something that pgfkeys
cannot do, so it could give an additional reason for switching to
l3keys to people who don't need pgfkeys for any of the fancier stuff.