It's not completely clear what you're aiming to do with your command, so these remarks are a little generic.
If you want to grep a large number of files for the word foo, for example, then you'd do something like
find . -type f -name \*.ext | xargs grep foo
The important thing here is that the \* is passed to find for it to expand, and it is not expanded by the shell. The 'Argument list too long' error is probably the result of the shell expanding your "*.ext" and trying to pass that long list as a bunch of arguments to find. This may be the key thing you're missing in your experiments here.
The way that xargs works is that it reads arguments from the stdin (in this case the list of files produced by find), and calls the given function repeatedly with as many of these arguments as will fit. If the strings being sent to xargs are at all unusual, you should look at the -0 option for xargs.
Another way to use find, which is more natural in some circumstances, is
find . -type f <whatever> | while read f; do some-command $f; done
Here, while again reads lines one at a time, assigning them in turn to f, which are processed one at a time in the loop.
xargs?echoto sort of produce a "what it might do" output.