Компилятор C# код не оптимизирует, что вы пишите, то и получаете в итоге, если сложно ковырять MSIL, можно проверить декомпиляторами, они восстанавливают переменные в подобных методах. Оптимизация уже может производиться в JIT компиляторе. Но всё равно без необходимости лучше не писать лишнего кода.
Если не путаю, ref и out это подсказки компилятору, по сути компилятор начинает генерировать код работающий с ссылками и не более. В плане генерируемого кода разницы не будет, но будет отличаться поведение самого компилятора на предмет нахождения ошибок.
На деле если хочется действительно знать что, как и почему, лучше почитать Рихтера.