I think your "." will be centered vertically, rather than shifted to the bottom (which I think is what you were concerned about?)
comparing different xlabs:
set.seed(123) #thanks to MvG for spotting
data = cbind(rnorm(25), rnorm(25), rnorm(25))
biplot(prcomp(data, scale.=T), xlabs=rep(".", nrow(data))) #your code
X11()
biplot(prcomp(data, scale.=T), xlabs=rep("·", nrow(data))) #"middle dot"
X11()
biplot(prcomp(data, scale.=T), xlabs=rep("˙", nrow(data))) #"dot above"
X11()
biplot(prcomp(data, scale.=T), xlabs=rep(".·˙", nrow(data))) #all three
X11()
biplot(prcomp(data, scale.=T), xlabs=rep("I", nrow(data)))
To me (R-3.0.1 on Win7) it looks like the plot takes the size/shape of the character(s) into account, as the three single dot examples are virtually identical despite their relative vertical positioning, and all appear in the middle of where the "I"s are plotted.
If you understand how the biplotted values are produced from the prcomp output (I don't):
str(prcomp(data, scale.=T)
You could make a blank biplot with
xlabs=rep("", nrow(data))
and add to it with points() made manually, but I think it would look the same. Your xlab is also not limited to using what you can see on your keyboard as you can use all kinds of special characters, e.g. ■●▲