Segue uma sugestão. agora não sei se funciona para todo caso. Mas basicamente é ver o que tem no merge com tudo no merge que so pega o que tem igual e usar isso de indice para um merge com tudo. E o codigo não vai ser muito eficiente assim para um data-frame grande, mas da pra quebrar o galho enquanto não aparece uma ideia melhor :)
a1 <- data.frame(a = 1:5, b=letters[1:5])
a2 <- data.frame(a = 1:3, b=letters[1:3])
merge(a1,a2,all=T)[!rownames(merge(a1,a2,all=T)) %in% rownames(merge(a1,a2)), ]
#Funciona independente do nomes originais das linhas
rownames(a1)<-sample(nrow(a1))
rownames(a2)<-sample(nrow(a2))
a1
a2
merge(a1,a2,all=T)[!rownames(merge(a1,a2,all=T)) %in% rownames(merge(a1,a2)), ]