So, if you have a Rc<dyn Foo_T> and call the foo method, what happens is that the Rc gets converted into the appropriate Rc<UnderlyingStruct> and then passed to UnderlyingStruct::foo.
However, you can't convert &Rc<dyn Bar_T> into a &Rc<UnderlyingStruct> because the conversion modifies the Rc, which you only have immutable access to.
Imagine we have a trait object t with type &dyn Tr, where Tr is some trait with a method m defined as fn m(&self);. When calling t.m(), the receiver t is a wide pointer, but an implementation of m will expect a narrow pointer as &self (a reference to the concrete type). The compiler must generate an implicit conversion from the trait object/wide pointer to the concrete reference/narrow pointer.
It works this way because Rc<FooStruct> implements DispatchFromDyn<Rc<dyn Foo_T>>, but &Rc<BarStruct> does not implement DispatchFromDyn<&Rc<dyn Bar_T>>.
If DispatchFromDyn was available for custom types (as well as more/custom types being allowed for self types to begin with), then something like rc_borrow::RcBorrow<'_, T> (crate by @CAD97) could implement it, which is a type that aims to work analogously to &Rc<T>, but without double indirection.
Anyways… once you work with dyn Trait already, you can probably also afford the overhead of unconditionally cloning an Rc (assuming the idea behind using &Rc<Self> was that you only conditionally need a clone of the Rc), so I guess all this isn’t too limiting, after all.
From the other posts it is obviously a little complex to us &Rc, but why do you need to borrow an Rc? Did you just do it by accident and wonder why it didn't work, or do you have a need for it?
And the point of my post was really only that I wanted to convince myself that it can be done to some degree on stable Rust ; and then I felt like why not post the code
(that's also why it was an answer/addition to my own post, nothing else)