There is actually a clever little approch that can be taken , using hsave and filter.

You save the hashtable with out itemnames at all using the /HSAVE -n option
You then filter the file however you requier but also apply the /FILTER -n option this adds line numbers, but the line numbers of the source file not the result file
Using this resulting file, you can now back refrence into the hashtable using the line number as the N in $hget(name, N).item and recover the itemname.

This occurs becuase the /hsave -n saves the items in the same order as the $hget(name,N).item/data has them, (likely there in memory order?) ie: $hget(name,1).data is on line 1 and so on, so when you sort them using /filter as long as you have filters -n option to pass the line number they came from, you can then look them back up.

Example code below
MAKE1000 is just to make a 1000 item table with random scores of 1 to 500
Code:
alias make1000 {
  hfree -sw hashtable
  var %i = 1000
  while (%i) {
    hadd -m hashtable $+(item,%i) $rand(1,500)
    dec %i
  }
}
alias top10 {
  hsave -no hashtable tempfile.txt
  filter -ffcteun 1 32 tempfile.txt tempfile.txt
  var %i = 1 | while (%i <= 10) {
    var %itemname = $hget(hashtable,$gettok($read(tempfile.txt,nt,%i),1,32)).item
    echo -a Top 10 $+(#,%i,) %itemname with a score of $hget(hashtable,%itemname)
    inc %i
  }
}


Hope it helps.