If you had started the erroneous example from a terminal, you would have noticed output similiar to the following:
$ emacsclient -c --eval '(helm-locate)'
*ERROR*: Wrong number of arguments: (1 . 1), 0
Comparing the arguments both
helm-locate require (which can be easily found out with
M-x find-function) reveals that while both commands are interactive,
mu4e doesn't require any argument at all,
helm-locate however does and is using
(interactive "P") to tell Emacs what to fill in when used interactively. The
P specification supplies a raw prefix argument, so without any prefix argument it's going to be
nil. That's why
emacsclient -c --eval '(helm-locate nil)' should do the trick.
interactive spec you're encountering is a lot more complex to figure out (there's an escape hatch to just use an s-expression that evaluates to a list of all arguments, it's used heavily inside Emacs itself and external packages as well), you can cheat by using
call-interactively, then the command to execute would be
emacsclient -c --eval "(call-interactively 'helm-locate)".