Я правильно понял, если после объявления неопределенной переменной X начать объявлять или менять значения другим переменным, то X "засорится"?
Наоборот.
int i;
Под переменную i выделен участок стека, лежащее в нем значение не меняется. Но в учебной программе из пары строк там, скорее всего, будет 0, и это создаст иллюзию, что все нормально. Кроме того, некоторые компиляторы в некоторых условиях инициализируют любые переменные, что еще больше запутывает ситуацию.
int i;
for(int n = 0; n < 10; ++n) {}
Под переменную i выделен участок стека, лежащее в нем значение не меняется.
Под переменную n выделен следующий участок стека, его изменение никак на i не сказывается.
for(int n = 0; n < 10; ++n) {}
int i;
Под переменную n выделен участок стека, его значение к концу цикла равно 10 - и уже ненужная переменная n уничтожается, освобождая место в стеке.
Под переменную i выделен участок стека, лежащее в нем значение не меняется. Это вполне может быть тот самый участок, который только что освободился, в нем записано 10 (С++ не выполняет ничего, что явно не указал программист - это оптимальный язык). Так что i вполне может равняться 10. Или нет.
Подобные ситуации называются "неопределенным поведением".
Программист на С++ обязан исключить их из своей программы.