First, implementing Drop means that the type must be valid at the end of its scope, and having &s inside it means that it won't be, since variables are dropped in the reverse order of their declaration.
Second, the borrow checker doesn't know that you overwrote it with None. You can comment out that line and it makes no difference. This could be allowed since r doesn't actually contain &s anymore.
A non-trivial destructor does change what is required for borrow checking. "Non-trivial destructor" includes a Drop implementation, but can also happen due to the types of your fields. Non-trivial destructors require exclusive access, like a move or taking a &mut _.
In the example, A<'_> has a trivial destructor without the Drop implementation.
Incidentally, the inner block does nothing in the example.
Clarification: The inner block doesn't change the lifetimes or other outcomes of borrow checking in any way.
s dropping at the end of the outer block (main) is incompatible with the lifetime being 'static, with or without the inner block.[1]
But the inner block doesn't restrict the inferred lifetime in anyway.[2]
The lifetimes of references[3] aren't confined to the block they're created in[4]
There are no uses at the end of the block (such as a variable going out of scope) that would conflict with a lifetime longer than the block
And from the complementary point-of-view, there's also nothing in the code that would require 'a: 'static with or without the block; the lifetime can expire after the last use of r[5] (be that in an inner block, the outer block, the end of some block, the middle of some block...[6])
Try making the annotation Option<A<'static>>, with or without the inner block. ↩︎