density refers here to the raw variable. Those contour lines are estimates of equal value, but not the actual raw data points that are exactly equal. It is the computed variable, ..level.. that contains the information about the lines.
For example, the outer most contour has a value of 0.005, but there are no observed points with that actual value: any(faithfuld$density == 0.005) gives FALSE.
Indeed by running:
p2 <- ggplot(faithfuld, aes(waiting,eruptions )) + geom_contour(aes(z=density,color= density))
ggplot_build(p2)$data
one can see that density isn't even in the data table used for plotting! Since stat_contour has calculated a transformation of the data, the original raw data cannot be easily matched to the new data describing the contour lines.
The only way to directly use density as the color would be to not do a transformation on the data (i.e. use stat_identity) such as:
ggplot(faithfuld, aes(waiting, eruptions)) +
geom_raster(aes(fill = density))

Note that it didn't have to be this way, the internally computed ..level.. could have been named as the original variable from which it was calculated. But the authors ggplot2 have made the design choice to make these computed variables not use the names of the aesthetic. This makes sense in other scenarios, such as stat_bin, where several computed variables (..count.., ..density.., ..ncount.. and ..ndensity..) are linked to the same y aesthetic.