In the second example substitute i32 for T and you get a function &'a i32 -> i32. The constraint is telling you the substitution is legal (because i32: 'a trivially).
But in the first example, when you substitute i32 in you get &'a i32 -> impl .... The type of the function is different as the return type has been erased. Even though it "is" i32, you are only allowed to use what the impl says and you've lost the fact that i32: 'static.
The difference are different types. When you write T that means… well, T.
When you write impl Trait in return position then creates something Haskell calls an existential type: that may still be T, under the hood, but you are not permitted to use that.
The rest of your code may only use functions from Trait and, if you added + 'a or use<T> it would be able to use for 'a (or for as long as T exists).
Because reference to type may have smaller lifetime than type itself (trivial example: i32: 'a for any 'a) impl T + 'a and impl T + use<T> are usable for a different lifetimes (that's actually why new use<T> syntax exists, before it's introduction there was not possible to express that desire).
In my first example, ra shows the type of num as impl Copy + Display. Rustc only knows type of num implements Copy and Display and satisfies Type: 'a. From the view of rustc, the actual type of num may be i32, &i32 or something else. In order to avoid dangling pointer, borrow checker has to restrict me from using num outside 'a which is inferred to not exceed scoop of num1.
In my second example, rustc knows num is i32. It can be used safely.