If it happens again I may have a clearer picture of how to trigger it, but here's a stack trace:
#0 0x00007feada6632c0 in xkb_state_update_mask () at /usr/lib/libxkbcommon.so.0
#1 0x000056168fee0187 in keyboard_modifiers (data=0x56168fee7d20 <state>, wl_keyboard=0x561691baeae0, serial=8405, mods_depressed=0, mods_latched=0, mods_locked=0, group=0) at ../swaylock/seat.c:64
state = 0x56168fee7d20 <state>
caps_lock = 22038
#2 0x00007fead944a6d0 in ffi_call_unix64 () at /usr/lib/libffi.so.6
#3 0x00007fead944a0a0 in ffi_call () at /usr/lib/libffi.so.6
#4 0x00007feada6528bc in wl_closure_invoke (closure=closure@entry=0x561691badba0, flags=flags@entry=1, target=<optimized out>, target@entry=0x561691baeae0, opcode=opcode@entry=4, data=<optimized out>)
at src/connection.c:1006
count = <optimized out>
cif = {abi = FFI_UNIX64, nargs = 7, arg_types = 0x7ffe3049a2c0, rtype = 0x7fead944b180 <ffi_type_void>, bytes = 8, flags = 0}
ffi_types =
{0x7fead944b060 <ffi_type_pointer>, 0x7fead944b060 <ffi_type_pointer>, 0x7fead944b0e0 <ffi_type_uint32>, 0x7fead944b0e0 <ffi_type_uint32>, 0x7fead944b0e0 <ffi_type_uint32>, 0x7fead944b0e0 <ffi_type_uint32>, 0x7fead944b0e0 <ffi_type_uint32>, 0x7feada65068b <wl_proxy_marshal_array_constructor_versioned+178>, 0x561691bae870, 0x28, 0x561691bae870, 0x0, 0x56168fee6c20 <wl_callback_interface>, 0x7ffe3049a370, 0x0, 0x7feada651cad <wl_closure_clear_fds+59>, 0x75, 0xfceb347a3cc71200, 0x1, 0x561691bae700, 0x1, 0x7feada651fd9 <wl_closure_init+129>}
ffi_args =
{0x7ffe3049a290, 0x7ffe3049a298, 0x561691badbb8, 0x561691badbc0, 0x561691badbc8, 0x561691badbd0, 0x561691badbd8, 0x561691bae7d0, 0x7ffe40000000, 0x561691ba9218, 0x7feada659d38 <wl_display_events+24>, 0x7feada6526fb <wl_closure_lookup_objects+160>, 0x561691ba9218, 0xfceb347a3cc71200, 0x91baa475, 0x561691bae0d0, 0x7feada654463, 0x3, 0x561691bae0d0, 0x0, 0x0, 0x7feada652de1 <wl_closure_destroy+22>}
implementation = <optimized out>
#5 0x00007feada650132 in dispatch_event (display=display@entry=0x561691ba91a0, queue=queue@entry=0x561691ba9268) at src/wayland-client.c:1427
closure = 0x561691badba0
proxy = 0x561691baeae0
opcode = 4
proxy_destroyed = <optimized out>
#6 0x00007feada650198 in dispatch_queue (display=display@entry=0x561691ba91a0, queue=queue@entry=0x561691ba9268) at src/wayland-client.c:1573
count = 4
#7 0x00007feada650ea6 in wl_display_dispatch_queue_pending (display=display@entry=0x561691ba91a0, queue=queue@entry=0x561691ba9268) at src/wayland-client.c:1815
ret = <optimized out>
#8 0x00007feada651049 in wl_display_dispatch_queue (display=display@entry=0x561691ba91a0, queue=queue@entry=0x561691ba9268) at src/wayland-client.c:1791
ret = <optimized out>
#9 0x00007feada651244 in wl_display_roundtrip_queue (display=0x561691ba91a0, queue=0x561691ba9268) at src/wayland-client.c:1238
display_wrapper = <optimized out>
callback = 0x561691bae9d0
done = 0
ret = 0
#10 0x00007feada651277 in wl_display_roundtrip (display=<optimized out>) at src/wayland-client.c:1267
#11 0x000056168feddfac in main (argc=4, argv=0x7ffe3049a698) at ../swaylock/main.c:1135
line_mode = LM_LINE
config_path = 0x0
result = 0
registry = 0x561691bad320
__PRETTY_FUNCTION__ = "main"
surface = 0x56168fee7c90 <types+112>