Your add_assign takes all parameters using a common P type, and your call is using P = A<'_, R>, but that forces them to have the same inferred lifetime. The shared a2: &A is covariant in A, so that can conform if you constrain its lifetime like 'a2: 'a1_and_engine, but &mut A and &dyn Engine<A> are invariant in A.
('_ is not a lifetime name; it is syntax for an explicitly unspecified lifetime, and what happens instead is according to the lifetime elision rules, which in this case mean a distinct lifetime for each input parameter. So you must instead use a named lifetime.)
You will have to change the trait definition to not use a single parameter P, or to not use &mut P so P can be covariant (not applicable since you want to mutate). For example, if we look at the AddAssign trait,
If the lifetimes are allowed to be different, then the compiler no longer has a way to prevent a1 from being mutated to contain references that may become invalid before a1 does. That's the rule that actually matters, here. Perhaps there is a different way to express what you want, but it will not contain a lifetime inside of P.
Perhaps what you need to do is stop having a lifetime in A. Or perhaps there's another solution. It will be easier for us to suggest solutions if you provide an example of what A actually is and why it needs a lifetime parameter.
You can get a little closer with generic associated types (GATs), but that means a type can't have multiple Engine implementations with different P, and it's also not object safe. Example:
If you're willing to dabble in nightly Rust, #95451 allows object safe GATs with an incomplete feature, #![feature(generic_associated_types_extended)].