this safety check wouldnt be possible because self.inner doesnt have the info to know if it'd fail, but not all methods of self.inner require this check so it'd be a boilerplate if i just copied every method it has
No. If you do what you've outlined, method resolution will find Outer's method first. But since you publicly exposed the Inner via the Deref implementation, there's no way to prevent Inner's method from being called (as also shown). In fact, it's not really recommended to try to overload things this way, as you'll likely end up with some situation where deref coercion has unexpectedly kicked in, and Inner's method will be called.
If you want to hide Inner's methods, don't expose the Inner. You will have to wire up the methods manually though, as you said. Macros may help reduce/hide the boilerplate.
Alternatively, have a (perhaps non-public) as_inner(&self) -> &Inner method instead to make things explicit (and perhaps private), and call self.inner().not_overloaded() when you need to.