1. На стеке находятся значения локальных переменных
2. В куче находятся значения ссылочных типов
3. В переменных ссылочных типов хранятся ссылки на значения в куче
Так что когда ты присваиваешь переменной новое значение, например так:
object obj = new object();
obj = null;
Ты не изменяешь значение в куче, а просто меняешь в переменной одну ссылку на другую, а исходных объект остаётся нетронутым