Being in an extern "C" doesn't affect whether the compiler optimises code or not. It just doesn't care.
LTO is a different kettle of fish that depends on what compilers and linkers are involved, and exactly what you're doing. Given that you're describing a callback-based system, that implies dynamic dispatch, which means LTO probably won't happen. But that's not a limitation of Rust, LTO just wouldn't apply on those sorts of calls.