The problem here is that ggplot2 is drawing the rectangle 100 times in the same location. Thus, 100 stacked transparent shapes appear as a single opaque shape. I discovered this by inspecting the pdf output with Adobe Illustrator. I have provided a possible solution below (re-written to use ggplot syntax instead of qplot). I certainly feel that this behavior is unexpected, but I'm not sure if it deserves to be called a bug.
My proposed solution involves (1) putting the rectangle data in its own data.frame, and (2) specifying the data separately in each layer (but not in the ggplot()
call).
library(ggplot2)
dat = data.frame(x=1:100, y=1:100)
rect_dat = data.frame(xmin=20, xmax=70, ymin=0, ymax=100)
# Work-around solution.
p = ggplot() +
geom_point(data=dat, aes(x=x, y=y)) +
geom_rect(data=rect_dat,
aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax),
alpha = 0.3, fill = "black")
ggsave("test.png", plot=p, height=5, width=5, dpi=150)

# Original version with 100 overlapping rectangles.
p2 = ggplot(dat, aes(x=x, y=y)) +
geom_point() +
geom_rect(xmin=20, xmax=70, ymin=0, ymax=100, alpha=0.01, fill="black")
ggsave("test.pdf", height=7, width=7)