Из того, что я помню, столкнувшись с подобной проблемой, UINavigationBar просто возьмет tintColor и сделает его темнее для UIBarButtonItem (если стиль не установлен на BarStyleBlack, в этом случае он становится серовато-серым).
Чтобы сделать то, что вы просите, я бы создал пользовательскую кнопку UIB с фоновыми изображениями для различных состояний элемента управления, которые соответствуют вашей цветовой схеме, а затем использовал эту кнопку UIBarton в качестве представления для пользовательского элемента UIBarButtonItem.
UIButton *customButton = [UIButton buttonWithType:...];
//normal_button.png and selected_button.png need to be created by you
[customButton setBackgroundImage: [UIImage imageNamed:@"normal_button.png"] forState:UIControlStateNormal];
[customButton setBackgroundImage: [UIImage imageNamed:@"selected_button.png"] forState:UIControlStateSelected];
UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView: customButton];
Если вы хотите попытаться инкапсулировать это, вы всегда можете создать фабрику или пользовательский метод init в UIBarButtonItem (через категорию) и использовать приведенный выше код (с небольшими изменениями).
Мне известно, что я не полностью затрагиваю ваш второй пункт о переопределении состояния управления категорией. Я не знаю, какой метод переопределить в UIBarButtonItem, чтобы сделать такую вещь, но вы можете выполнить то, что вы хотите, с помощью метода swizzling (http://cocoadev.com/index.pl?MethodSwizzling), как только вы узнаете, какой метод вы хотите обменять.
Должен заметить, что я когда-либо использовал swizzling только для тестирования / отладки.