In your case "$isstarting" is just a matter of checking whether your timer was created. You can also solve any other problems by unsetting %uptimepercent.start when you exit (and when you clean .temp), that way you can also check that .start is not set before setting it (in case only the timer was somehow turned off and script reloaded).

Code:
on *:start:{
  ;%uptimepercent.beginning is the "zero" point on which the script bases the start of measuring uptime
  if (!%uptimepercent.beginning) set %uptimepercent.beginning $ctime
  ;incase the on exit event didn't trigger (crash or something) updates total time
  if (%uptimepercent.temp) upaddtime %uptimepercent.temp
  if (!$timer(UPTIME)) {
    ;periodically set %uptimepercent.temp in case of crash or something (it happens), this prevents loss of up time
    .timerUPTIME -o 0 600 set %uptimepercent.temp $!ctime
    ;%uptimepercent.start is when mirc was started
    if (!%uptimepercent.start) set %uptimepercent.start $ctime
  }
}
 
on *:exit:upaddtime $ctime

alias upaddtime {
  ;adds the uptime from mirc start to exit to the total overall uptime
  set %uptimepercent.up $calc(%uptimepercent.up + ($1 - %uptimepercent.start))
  unset %uptimepercent.temp
  unset %uptimepercent.start
}
 
alias uppercent {
  say 7Uptime Percentage: $calc(100* ( %uptimepercent.up + ( $ctime - %uptimepercent.start )) / $&
    ( $ctime - %uptimepercent.beginning ) ) $+ % since $asctime(%uptimepercent.beginning)
}