To do what you suggest, R will have to change the scope rules for for loops. This will probably never happen, because I'm sure there is code in packages that rely on it. You cannot use the index after the for loop, but assuming the loops can break() at any time, the final iteration value is not always known in advance. And repeating this as a global option will cause problems with existing code in work packages.
As already indicated, for more common applications in R, loops or laplets are used. Sort of
for(i in 1:4) { lm(data[, 1] ~ data[, i]) }
becomes
sapply(1:4, function(i) { lm(data[, 1] ~ data[, i]) })
You should not be afraid of functions in R. After all, R is a functional language.
It is good to use for loops for more control, but you will have to take care to remove indexing from rm() , as you pointed out. If you do not use another indexing variable in each cycle, I am surprised that they accumulate. I am also surprised that in your case, if they are data.tables, they add extra memory, since data.tables do not by default make deep copies by default. The only "price" of memory you paid is a simple pointer.
source share