You should never loop with $findfile(,,N). Here's why:
$findfile(c:\,*,0) - loops through every file in the directory increasing a variable each time and then returns it.
$findfile(c:\,*,1) - loops through files until it finds the 1st matching file.
$findfile(c:\,*,100) - loops through files until it finds the 100th matching file.
So, if you have 10 files in a directory looping with $findfile(,,N) will have to go through 55 (10+9+8+7+6+5+4+3+2+1) files, not 10. As you can imagine this number will increase greatly when you have 100s of files.
When you use $findfile(,,0,command) it will only loop through the files in the directory once. This greatly speeds up any listing process.
As for your actual question: no, there's not a faster way to list files. $findfile uses the fastest method of listing files available on windows. If it's the locking up you're bothered about more than the speed you could use WhileFix.dll (available in mircscripts.org's dll section) to stop the freezing, but the files will take even longer to list then.
I'd imagine the speed would increase slightly if you didn't use the $longfn() identifier with the .shortfn property though ($findfile passes long filenames by default, so it makes no sense to do that).