Is there a way to change the effect of chorded modifier keys without making them layer keys?

The easiest, in my opinion, would be a custom event handler hook, something along these lines:

Key customControls(Key mapped_key, byte row, byte col, uint8_t key_state) {
  // If none of the controls are pressed, fall through.
  if (!kaleidoscope::hid::wasModifierKeyActive(Key_LeftControl) &&
      !kaleidoscope::hid::wasModifierKeyActive(Key_RightControl) {
    return mapped_key;

  // Either left or right control is active!

  // If the key isn't C, fall through
  if (mapped_key != Key_C)
    return mapped_key;

  // If we are idle, fall through
  if (!keyWasPressed(key_state) && !keyIsPressed(key_state))
    return mapped_key;

  // So we are not idle, one of the controls are held, and C is our key.
  // Time to release the Kraken^WControls, and replace C with UpArrow.
  kaleidoscope::hid::releaseKey(Key_LeftControl);
  kaleidoscope::hid::releaseKey(Key_RightControl);
  return Key_UpArrow;
}

// Somewhere in `setup()`:
Kaleidoscope.useEventHandlerHook(customControls);

This is all untested code, mind you, and may or may not work, or have side effects. It may not even be the best solution. But this is the first that came to mind.

Hope it is useful, nevertheless.

2 Likes