The way you describe your project there is a pretty strong case for defining your dishes as Matrix rows instead of entries as you described (ie, restaurants defined as an entry with a Matrix for the menu and each dish being a Matrix row).
That said, as an alternative you could define dishes as fully-fledged entries and relate them to restaurants using a Playa field in the restaurant entry. This would allow you to use one of the rating add-ons that works with entries, but your menus would be more fragmented in the system and maybe less convenient/intuitive from a maintenance standpoint.
But since ratable Matrix rows sounds like the best approach, take a look at VZ Average. I have not tried it but according to the docs it supports rating Matrix rows.
VZ Average is a flexible and minimal framework for rating or tallying
anything in EE that you can identify with an ID: a channel entry, a
comment, a Matrix row, or anything else. A few possible uses for it
include: star ratings, thumbs up/down ratings, flagging comments as
offensive, voting on entries, etc.
I actually discovered this add-on just now and wish I had known about it earlier since I had a very similar project requirement and ended up building a custom module. Building the module was fun, but if I had known about VZ Average I would have at least tested it out!