Собрали утилиту chknsk, вот ее вывод на работающем ключе (поля ID и Public Code изменены):
Welcome to Guardant Diagnostic Tool! (v1.0001)        
Detecting Guardant dongles ...
------------- Guardant Code Time Dongle ---------------------------------------
  Produce Date (dd.mm.yy):                      21.05.2019 (ID=0xXXXXXXXX)     
  Versions (Hrw,MCUF,Type,PrtSup,Std,Cl,DSt):   0.1,00,5F0,00,00,0.0,0         
  Supports:                                     PI,TRU,RTC,AES,ECC,CODE        
  Global Flags:                                 PTIME,HID                      
  Public Code:                                  XXX_XXX (0xXXXXXXXX)           
-------------------------------------------------------------------------------
 Firmware  ProgNum  Version  SerialN GPcounter  Mask   NetRes RealRes  Index   
-------------------------------------------------------------------------------
 1.0.2.21        0        1      104         0  0000h       0       0 00000000 
-------------------------------------------------------------------------------
Result: 1 dongle(s) found. Press Enter...
Подождем когда ключ зависнет вновь и снова попытаемся ее выполнить.
По поводу хендлов. У нас используется первый описанный вами вариант. Над библиотекой grdapi написана дополнительная библиотека, которая работает непосредственно с ключем, в ней используется однин хендл. Перед выполнением любой функции GrdAPI происходит блокировка семафором, а вызовы фунукций GrdCodeRun дополнительно огорожены функциями GrdLock, GrdUnlock. Так же хотелось бы отметить, что обращение к ключу идет из нескольких процессов, в некоторых из них и из разных потоков.
Функции GrdFind и GrdLogin обращаются только к локальным ключам, так как перед их вызовом выполняется функция:
GrdSetFindMode(keyHandle, GrdFMR_Local, GrdFM_Type, 0, 0, 0, 0, 0, GrdDT_RTC, GrdFMM_CodeUSB, GrdFMI_USB);
Для поиска ключа мы действительно используем функцию GrdFind, а GrdLogin уже выполняется после успешного выполнения GrdFind. Учтем ваше предложение по поводу удаления функции GrdFind из кода, спасибо.
Мы провели эксперимент: после того как ключ уже находился в "зависшем" состоянии, было написано тестове приложение, в котором вместо вызова функции GrdFind была использована функция GrdLogin, но ее  выполнение так же происходит с ошибкой до тех пор пока не передернешь физически ключ.
Еще провели небольшой эксперимент на предмет того, что зависает ключ или драйвер. При "зависшем" ключе перезагрузили ПК, при этом с помощью осциллографа убедились, что питание на USB в момент перезагрузки не обрывалось. Так вот после перезагрузки ключ прекрасно начал работать, т.о. предположительно что-то в драйвере ключа происходит.
Ключи у нас работают в HID режиме.