Почему unsafe код небезопасен и его редко используют в C#?
Редко unsafe используют - потому что нахрен он нужен в языке, который принципиально улучшен как раз тем что код полностью managled.
Уж всяко не в вашем примере, а ради задач посерьезнее стоит заморачиваться с unsafe.
А прямая работа с указателями исключена - потому что как раз именно с указателями в С++ случается чуть ли не больше всего ошибок у программистов.
Плюс хуже работает сборщик мусора, когда вы используете указатели.
Считаете себя крутым и пишущим без ошибок (хотя это и не так, 100% не так) и вам не нравятся ограничения C# - ну и не пишите на C#, в чем проблем-то?
Но возмущаться что в одном языке одна идеология, а в другом другая - как то странно.Зачем бы были нужны языки с одинаковой идеологией.
Они очень разные.
С# и C++ только по синтаксису сходны. 
Не нужно чисто механически привносить в один язык подход из другого языка.
 Т.е. есть ситуация - у меня есть класс с 150 переменными (int), я хочу непосредственно эти переменные менять, передавая её в другой класс
Вероятность схлопотать сторонние эффекты очень велика.
Класс это ведь не просто одна переменная как правило.
Если вы эту переменную инкрементируйте, состояние всего класса как то может сильно поменяться.
Если вы меняете напрямую, не давая классу это проконтроллировать - непонятно к чему это может привести.
НО мне что, 150 функций
А их и не должно быть у вас 150.
См. антипаттерн - класс Бог.
Кто триппером не болел - тот не гусар -)
Небезопасный код совершенно не страшен и даже совсем безопасен, если мозгов пишущего хватает на то, чтобы предусмотреть все последствия.
Как показывает практика - даже у старух бывают фейловые прорухи. Зачастую глобальных масштабов.
Как примеры - те же до сих пор появляющиеся уязвимости на переполнении стека и прочих классических штук времен Моррисона