This is now fixed in v1.8.11, but probably not in the way you'd hoped for. From NEWS:
FR #4867 is now implemented. DT[, as.factor('x'), with=FALSE] where x is a column in DT, is now equivalent to DT[, "x", with=FALSE] instead of ending up with an error. Thanks to tresbot for reporting on SO: Converting multiple data.table columns to factors in R
Some explanation: The difference, when with=FALSE is used, is that the columns of the data.table aren't seen  as variables anymore. That is:
tst[, as.factor(a), with=FALSE] # would give "a" not found!
would result in an error "a" not found. But what you do instead is:
tst[, as.factor('a'), with=FALSE]
You're in fact creating a factor "a" with level="a" and asking to subset that column. This doesn't really make much sense. Take the case of data.frames:
DF <- data.frame(x=1:5, y=6:10)
DF[, c("x", "y")] # gives back DF
DF[, factor(c("x", "y"))] # gives back DF again, not factor columns
DF[, factor(c("x", "x"))] # gives back two columns of "x", still integer, not factor!
So, basically, what you're applying a factor on, when you use with=FALSE is not on the elements of that column, but just that column name... I hope I've managed to convey the difference well. Feel free to edit/comment if there are any confusions.