Here are two approach that will probably make @hadley kill some kittens...
# make sure that order.df contain character not factors
r <- lapply(order.df, as.character)
# create a list of names refering the columns
rl <- lapply(r[['column']],function(x)list(column = as.name(x)))
# create the appropriate list of arguments
rexp <- unname(Map (f=function(order,column){
cm <- force(column)
if (order =='-'){rn <-substitute(desc(column),cm)} else {
rn <- substitute(column,cm)}
rn
}, order=r[['order']],column = rl))
do.call(arrange, c(alist(df=df),rexp))
# strain sex age
#1 R M 64d
#2 R F 64d
#3 I M 8d
#4 I F 8d
#alternatively, use as.quoted...
fmts <- ifelse(r[['order']]=='-', 'desc(%s)','%s')
rexp2 <- lapply(unname(Map(fmt = fmts, f= sprintf,r[['column']])),
function(x) as.quoted(x)[[1]])
do.call(arrange, c(alist(df=df),rexp2))
# strain sex age
#1 R M 64d
#2 R F 64d
#3 I M 8d
#4 I F 8d