The difference is in the feelings of the person who complains. "Kritikovati" is to criticize, like in English: to tell a person what they're doing wrong.
"Zamerati" implies feeling offended, being angry with the person because of something they did. It means to object because we're offended.
For example: "Zameram ti što me nisi pozvao" - we're criticizing and we're saying that the act offended us.
If you "zameraš" you can say it or keep it for yourself. It has nothing to do with that. Usually you say it, at least in the form of badmouthing the person in question. :)