In ggplot the aesthetics are stored as expressions and evaluated when the plot is rendered. So qplot(i) does not generate a plot, but rather a plot definition, using a reference to the variable i. All three plots are the same in the sense that they all reference i.
If you type
list2[[1]]
after the second loop has run, you cause the ggplot object stored in list2[[1]] to be rendered, using whatever value i is set to at the moment (which is 3 after the loop).
Try this:
i <- 4
list2[[1]]
Now the plot rendered is equivalent to qplot(4).
The workaround depends on what you are trying to achieve. The basic idea is not to use external variables in aesthetics. So in your trivial case,
for(i in 1:3){
list2[[i]]<-ggplot(data.frame(x=i), aes(x))+geom_histogram()
}
will work. This is because the reference to the external variable i is not in the aesthetics (e.g., the call to aes(...).