The reason it isn't working is that you're evaluating the variables before the timer fires. Try this:

Code:
raw 311:*:{
  set %311address $1 is $4
}
raw 307:*:{
  set %307registered $2-
}
raw 312:*:{ 
  set %312server $1 is using $3
}
raw 317:*:{
  set %317nick $2
}
on *:text:!whois*:*: {
  set %whochan $chan  
  /whois $2
  /timerreg 1 5 /msg %whochan % $+ 307registered
  /timerserv 1 5 /msg %whochan % $+ 312server
  /timernick 1 5 /msg %whochan % $+ 311address
}