I think this is a fantastic question. Benjamin Jex's answer offers a good heuristic, but, as the comments note, even that heuristic doesn't match the behavior of many important UI surfaces.
I tried finding UX research about this (which I assume was the intent of the question) and couldn't find anything specific. However, WCAG does have guidance for pointer gestures (SC 2.5.2 Pointer Cancellation), where they strongly recommend the up event for most gestures:
For functionality that can be operated using a single pointer, at least one of the following is true:
No Down-Event
The down-event of the pointer is not used to execute any part of the function;
Abort or Undo
Completion of the function is on the up-event, and a mechanism is available to abort the function before completion or to undo the function after completion;
Up Reversal
The up-event reverses any outcome of the preceding down-event;
Essential
Completing the function on the down-event is essential.
And they explain why:
The intent of this success criterion is to make it easier for users to prevent accidental or erroneous pointer input. People with various disabilities can inadvertently initiate touch or mouse events with unwanted results.[...]
Benefits
- Makes it easier for all users to recover from hitting the wrong target.
- Helps people with visual disabilities, cognitive limitations, and motor impairments by reducing the chance that a control will be accidentally activated or an action will occur unexpectedly, and also ensures that where complex controls are activated, a means of Undoing or Aborting the action is available.
- Individuals who are unable to detect changes of context are less likely to become disoriented while navigating a site.
In other words, waiting until pointer up gives users the opportunity to cancel the action and pause before initiating a change of context. I'll be the first to acknowledge that these goals do not correspond completely to keyboard presses (you can't really cancel a keypress), but I think they offer a useful heuristic:
Perhaps use KeyUp for keyboard gestures that a user might initiate but then want to pause before executing (like where undoing that action might be difficult).
For example, I want to send an IM to my boss, so I might press Enter---but before I release, I reread the message. Whereas with pausing a video, I may indeed want to pause before executing, but undoing the pause is easy.
I've also seen apps prefer KeyDown for actions they want to be perceived as "fast". For example, Edge submits searches in the address bar (and I believe Chrome's, too; disclaimer: I work for Microsoft) on KeyDown, not KeyUp, as does the chatbox submit chats on Facebook Messenger. Executing on the down saves several milliseconds, since people move their fingers slowly. Luckily, these scenarios are usually easy to undo (I can easily navigate to a different page in Chrome, even if I accidentally submitted a query).