Refresh only sets a limit on how long expression can go without being updated. To keep t form being updated more often add a pause.
t = 1; Dynamic[Refresh[Pause[1]; t++, UpdateInterval -> 1, TrackedSymbols :> {t}]]
or do what Mr.Wizard indicated, which is better.
But this sort of thing is best done by higher level constructs such as Clock or Trigger. For example:
status[t_, t1_] := Row[{t, " > ", threshold, " is ", t > t1}]
Dynamic[With[{dt = 1, tmax = 10, threshold = 4},
t = Clock[{0, tmax, dt}, tmax, 1]; status[t, threshold]]]
The above will run for 10 seconds and will update once a second showing whether or not the value of t has passed t = 4.
Trigger gives more control. The following does what the previous example does, but allows the process to be paused and restarted further, the process can be repeated without re-evaluating the code.
With[{dt = 1, tmax = 10, threshold = 4},
Column[{
Dynamic @ status[t, threshold],
Trigger[Dynamic@t, {0, tmax, dt}, dt,
AppearanceElements -> {"PlayPauseButton", "ResetButton"}]}]]
Dynamic. – mfvonh Jul 22 '14 at 15:02TrackedSymbols -> {}there. I realize it is teaching by example but at the same time sometimes it takes a description for the "aha!" moment. – Mr.Wizard Jul 23 '14 at 03:32