I'm going to write what will hopefully be some reference material here, so, sorry if this ends up a little long-winded.
At a high-level, a swapchain is a mechanism for getting contents from a back buffer, where you've rendered something into a surface, into a front buffer, where it is being displayed on the screen. This holds pretty much true across all of the properties of swapchains, whether windowed or fullscreen. Since your post is about fullscreen, I'll deep dive a bit on fullscreen.
When a DXGI swapchain gets created, it always starts out windowed. You end up with a set of back buffers. If you requested to create it fullscreen, it will transition to fullscreen before it returns to you, but it always does this as a second step in the creation process. As part of this transition to fullscreen, you end up with a front buffer being allocated for your swapchain.
The properties of this front buffer can depend on up to two things. Firstly, if your swapchain does not have the ALLOW_MODE_CHANGE flag set, then this front buffer's properties will match the current desktop mode, i.e. what was set in the control panel for the resolution and refresh rate. If your swapchain does have the ALLOW_MODE_CHANGE flag set, then we'll go ahead and find the mode which most closely matches your back buffer properties. At this point, the back buffers for your swapchain cannot be scanned out directly, because they were allocated as windowed back buffers, so they are not capable of being flipped/swapped/rotated to the screen.
The next step in the process of transitioning to fullscreen is to reallocate your back buffers so that they can be scanned out directly. This is done by calling ResizeBuffers. At this point, if you're already fullscreen, we'll check if we can make back buffers for your swapchain that can match the front buffers exactly, and if so, we'll set you up so that your back buffers and front buffers can be swapped through in a single chain. If not, you end up in what we call proxy mode, where each Present() does a copy to a front-buffer-like surface, which then flips with the currently displayed front buffer. Note that if you request to create a fullscreen swapchain, this happens before the swapchain is returned to you.
Now, a word of warning. During the ResizeBuffers step, we check if your back and front buffers match exactly. The refresh rate can sometimes screw you here. The refresh rate of the back buffers is something that can only be set during swapchain creation time. The refresh rate of the front buffers comes from a display mode. If there is no display mode that is an exact match for your swapchain's specified refresh rate, you will end up permanently in proxy mode. If your swapchain's refresh rate is 0/0 or 0/1, then the refresh rate isn't considered when figuring out if it's a match, and you're more likely to end up getting the more optimal flipping path. I've seen this behavior too many times to be able to recommend setting a refresh rate in the swapchain other than 0.
If you do need to be able to set a specific refresh rate for your fullscreen swapchain, I suggest using the ResizeTarget API while fullscreen to achieve the desired mode change. This runs the same FindClosestMatchingMode logic that SetFullscreenState does, but lets you specify the desired properties instead of inferring them from the back buffer properties.
Now for the rest of your questions:
1. Is it correct to only use 1 as VSync interval?
If your target framerate is 60hz, and the current mode's refresh rate is 60hz, then a sync interval of 1 will get you 60hz (assuming your app can keep up). A sync interval of 2 will get you 30hz. Note: If you're targeting 30hz due to expecting long-running rendering, I can only recommend sync interval 2 when running windowed with the FLIP_SEQUENTIAL or FLIP_DISCARD sync intervals, due to slightly different semantics from these modes compared to legacy blt or fullscreen modes.
2. What is the good way to find the refresh rate?
Use IDXGIOutput::FindClosestMatchingMode or IDXGIOutput::GetDisplayModeList. If you want the current mode, use unspecified values for all properties in FindClosestMatchingMode.
3. You can pass a null pointer for the output so you don't have to release it... You also don't need to explicitly minimize and restore your window.
4. Yes, destroying a fullscreen swapchain will crash your app.