Tested on a clean copy, with a slightly updated script to check the read %var scope:
Code:
alias testsw {
  ;set %a $null

  sockclose testsw*
  socklisten testsw 8005
  .timer 1 1 sockopen testsw2 127.0.0.1 8005
}
on *:socklisten:testsw:{
  if (!$sockerr) sockaccept testsw1
}
on *:sockopen:testsw2:{
  if (!$sockerr) sockwrite testsw2 1
}
on *:sockread:testsw1:{
  if (!$sockerr) {
    var %a
        
    echo -a #0 sock.rq $sock($sockname).rq

    sockread -f %a
    echo -a #1: $qt(%a) -- var[ $var(%a, 1).global - $var(%a, 2).local ] -- sockbr $sockbr -- sock.rq $sock($sockname).rq

    sockread -f %a
    echo -a #2: $qt(%a) -- var[ $var(%a, 1).global - $var(%a, 2).local ] -- sockbr $sockbr -- sock.rq $sock($sockname).rq

    sockread -f %a
    echo -a #3: $qt(%a) -- var[ $var(%a, 1).global - $var(%a, 2).local ] -- sockbr $sockbr -- sock.rq $sock($sockname).rq

    sockclose testsw* 
  }
}


I also tested commenting the "var %a" line in the on sockread event and adding "set %a $null" to the /testws alias. The results are the same. The variable gets unset by the 2nd sockread regardless of scope:
Code:
#0 sock.rq 1
#1: "1" -- var[ %a - ] -- sockbr 1 -- sock.rq 0
#2: "" -- var[ - ] -- sockbr 0 -- sock.rq 0
#3: "" -- var[ - ] -- sockbr 0 -- sock.rq 0

AND

#0 sock.rq 1
#1: "1" -- var[ - %a ] -- sockbr 1 -- sock.rq 0
#2: "" -- var[ - ] -- sockbr 0 -- sock.rq 0
#3: "" -- var[ - ] -- sockbr 0 -- sock.rq 0


I am SReject
My Stuff