-regex corresponde ao caminho do arquivo inteiro (não apenas ao nome) e é ancorado por padrão ( ^ e $ implícito).
Aqui, você não precisa de regexps, você pode usar o padrão -name , que usa um padrão curinga e corresponde ao nome do arquivo, não ao caminho:
find . -name '*hello*' -name '[[:alpha:]][[:alpha:]]-[1-9]*'
Para nomes de arquivos que começam com 2 letras, um hífen e um dígito de 1 a 9 e contêm "olá".
Com regexps, e aqui com FreeBSD / OS / X find , isso teria que ser:
find -E . -regex '.*hello[^/]*' -regex '.*/[[:alpha:]]{2}-[1-9][^/]*'
Você precisa de [^/]* em vez de .* , caso contrário, isso corresponderia a ./aa-9/hello/foo/bar , por exemplo.
Em qualquer caso, find <dir> *hello* não faz o que você acha que faz. O shell expande esse *hello* glob para a lista de arquivos ou diretórios não ocultos no diretório atual cujo nome contém "hello" e passa o resultado como argumentos extras para find .