1) Конечно с paintEvent этой проблемы нет, но такое рисование "не портабельно", напр я не могу его свободно применить к имеющимся меню, а если нет исходников UI - то с приветом. Поэтому рассматриваем рисование через стили
2) Уникальность текста не гарантируется, более того, именно поэтому-то и нужны разные цвета.
либо, экстремальней, через позицию из QStyleOptionMenuItem::rect.
Это мне не приходило в голову

Однако поиск должен учитывать сепараторы и иконки. И, найдя индекс, что дальше? Нужно как-то подать QHash в рисование и опять возникают проблемы пункта 1
3)
Можно еще попробовать момент с QWidgetAction, честно признаюсь что сам его не пробовал, но последовательность примерно такова: делаем какой-нибудь QLabel (можно ему и имя задать чтобы потом допустим менять через QSS ему стили), создаем QWidgetAction и пихаем в него наш лейбл, виджетэкшон через addAction пихаем в QMenu.
Так будет работать, но тогда он рисует созданный QLabel. И опять-таки не выходит отделаться установкой стиля - нужен свой класс.
В общем сделал так: закодировал цвет в тексте, выглядит так:
Item 1~~##FF0000FF~~ // красный
А на рисовании извлекаю. Конечно это достойно эпитетов "костыль", "через задницу" и.т.п.
2Верес если хотите я отвечу на Ваш пост, правда это будет немного др тема