r1 holds a reference to s which gives it temporary access to s's value. Once r1 is no longer used s becomes accessible again. In your example r1 is never used so s immediately becomes accessible again. If instead you tried to use it after s's print you'll see it fail. For example this gives you a compile error:
fn main() {
let mut s = String::from("Mutable");
let r1 = &mut s;
println!("s : {} ",s);
println!("r1 : {}",r1);
}
In older versions of Rust, you would get a compile error unless you introduced an { let r1 = ... } block to limit the scope of r1. This proved to be not very ergonomic, so "non-lexical lifetimes" (NLL) were added to the language to fix that, resulting in what you've observed.