SW,
The USB stack has features that you can utilize to do exactly as you're intending. First, you should understand that the stack itself queues data packets to be sent. You can queue at most MAX_QUEUE_ELEMS of packets. By default, this macro is set to 4 in usb_hid.h. As DerekLau suggested, you can repeatedly call USB_Class_HID_Send_Data() until it does not return USB_OK. At that point, you know the last packet you tried did not send, so you could retry it.
But do realize that just because that function returns USB_OK, that does not mean that the packet has been sent. It simply means that it has been accepted by the stack to be queued for sending, and it will be sent when it is its turn in the FIFO. So keep in mind that the stack still has a pointer to your data packet, and it is NOT OK for you to reuse that data buffer until the stack has sent the data.
It is very important that you keep track of the memory that you have passed to the stack, and make sure that you do not reuse the buffer until your application receives the event callback USB_APP_SEND_COMPLETE. Once you have received that callback event, you can then reuse the buffer. This event will be sent to the callback function that you registered when you called USB_Class_HID_Init(). In the stack examples, this callback function is often called USB_App_Callback.
My guess would be that you are reusing the same buffer over and over to queue data to the stack, thus you are overwriting data before it is sent, giving the impression that keys are "lost".
Also, it is a very bad idea to queue data to the stack in the app callback (because it is essentially an interrupt routine). It would be best to set a flag in this callback to tell your main routine that a buffer is free, and you can send more data. Alternatively, you could create a simple FIFO that tracks what buffers have been sent to the stack, and what buffers the stack has sent.