Ultimately ##thread-interrupt! calls ##thread-int! in _thread.scm
Thread-int! sets thread-result of interrupted thread to (lambda () (your-thunk) (##void)) and insert interrupted thread on run-queue.
thread-result is passed as second argument to thread-restore! and if you look at ___JUMP_THREAD_RESTORE2 in gambit.h , the last step is a jump to this procedure.
So it is executed in the interrupted thread. If interrupting thread and interrupted thread are the same, then it is just a call to the function.