Você precisa incluir o * na negação, por exemplo:
ls !(foo*)
Editar (para esclarecer): O padrão de globulação solicitado [estendido] é !(foo*) . Se usado com o comando compgen , a chamada seria, por exemplo:
compgen -G "!(foo*)"
Você precisa de cotações para passar o padrão para o comando compgen unexpanded.
Editar (após a alteração da pergunta): para o seu padrão completo na sua pergunta editada, experimente um dos @(!(foo*)|*bar) ou @(!(bar*)|*foo) . (Veja meu comentário abaixo se não é isso que você espera.)