Vamos alterar seu padrão um pouco para que possamos ver o que acontece (basta adicionar ^.* ao início para que toda a linha de entrada seja substituída pela referência anterior):
$ echo abc1xxxx@abc3abc4@111 | sed -rn 's/^.*((abc.|xxx.){3}).*//p'
xxx@abc3abc4
Portanto, corresponde a xxx@ seguido por abc3 seguido por abc4 . Isso é perfeitamente legal e esperado, já que o padrão está procurando por três ocorrências de abc. ou xxx. .
O abc1x no início de sua linha de saída nunca foi afetado pelo padrão e, portanto, também nunca foi substituído pela substituição. Acabou de ser passado da entrada.