There is a way to set up the wgpu::Surface without any unsafe or lifetime restrictions. All you have to do is put the winit window in an Arc, which then can be cloned and passed to wgpu::Instance::create_surface(). This ensures that the window exists for as long as the surface does.
let window = Arc::new(window);
let surface = instance.create_surface(Arc::clone(&window))?;
// save and use original `window` as needed...
There is no need to contort the control-flow of your program, or use unsafe code, to satisfy wgpu.