Uma solução:

# Mostrando o que significa cada coisa
is.na(dados$x4)
is.na(dados$x5)
(is.na(dados$x4) | is.na(dados$x5))
!(is.na(dados$x4) | is.na(dados$x5))

# Na verdade só precisa disso aqui:
dados[!(is.na(dados$x4) | is.na(dados$x5)),]

Em resumo, tu precisa de um vetor de TRUE/FALSE para pegar só algumas linhas (ou o número das linhas, mas T/F é mais direto)