Нет, никакой оптимизации, как вы описали, нет, но вы можете написать метод, который выполняет обратную + прописную в одном цикле.
Обязательно ознакомьтесь со стандартной библиотекой Benchmark . При написании оптимизаций всегда бенчмарк, никогда не предполагайте:)
PS: reverse.upcase
по-прежнему O (n). Обозначение Big O игнорирует константы.