Well you are moving an &mut State into the closure, and mutable references always require exclusive access to the pointee. This means that if the shutdown hook has a mutable reference, nothing else can access state while that hook exists.
SIGTERM can get delivered at any point, including points where state is in an inconsistent state, like in the middle of a write. Also LLVM optimizes based on the assumption that the State passed to read_eval_print is not modified for the duration of the call. This includes the ability to keep (some) updates in registers and only apply them when returning from read_eval_print.
As workaround you could set a static AtomicBool from the signal handler and check for it inside the loop of read_eval_print. If you want the read to be interruptible, you could avoid using read_line and instead use read. If the error returned from read is ErrorKind::Interrupted, that means a signal was delivered. Read the AtomicBool and if it is not set, you should retry the read. If it is set you should return from read_eval_print.
The other option is to store a clone of state in a static and access that one from the signal handler. Just make sure that you don't use a mutex, to prevent deadlocks. Instead use AtomicPtr or better crossbeam::AtomicCell.