Thanks Mariusz, but this is exactly what I said I was doing in my original post. This works fine with this simple example, it's more tricky with more involved functionals.
Probably VariationalD not work with functionals.
You can try:
<< VariationalMethods`; VariationalD[f[z]^2, f[z], z] /. z -> x + a (*2 f[a + x]*)