Since the dat has type &mut T, &mut dat has type &mut &mut T. That's why you need to mut specifier on the dat variable itself. Note that the y(&mut dat) will be desugared into y::<&mut T>(&mut dat) so it will takes &mut &mut T.
deref coercion could be used here, but not in this exact code, because y is generic and its type parameter T is not known from other places.
From inside x, calling y::<T>(&mut dat) and y::<T>(dat) should both work equivalently, and that's due to deref coercion. With the explicit type, the type to coerce to is known.