Your examples miss the expected trailing semicolon:
find . -type f -name "*.c" -exec chmod 644 {} \;
After revising the question, it is "fish" shell. This is a known issue which can be worked around using quoting as @rahul noticed. However, the escaping suggested does not work for my configuration: single quoting does:
find . -type f -name "*.c" -exec chmod 644 '{}' \;
find . -type f -name "*.c" -exec chmod 644 '{}' +
What does happen (if one types the characters rather than cut/paste) is that on trying to edit the command-line to escape the curly braces, fish gets confused and cannot proceed. Here's a screenshot just after inserting the backslashes (no point in trying to cut/paste that):

and then pressing return:

So no, fish doesn't really work with escaped curly braces. It only pretends to do that. Continuing to press enter gives a conclusive demo:

Further reading:
{}
with"{}"
or'{}'
i.e.find . -type f -name "*.c" -exec chmod 644 '{}' +
– the_velour_fog Aug 04 '16 at 09:16;
after+
? – Anthon Aug 04 '16 at 09:20;
, ie..... chmod 644 {} +
. Then Thomas Dickey posted his answer, then the OP edited to add the;
as you see it now. I know that still doesn't explain properly why the OP did it though... – the_velour_fog Aug 04 '16 at 09:22+;
looks someone mixed up things from find's man page. – Anthon Aug 04 '16 at 09:25bash
andfish
eat it before passing the arguments tofind
– ilkkachu Aug 04 '16 at 09:31