You can load a scene without destroying anything in the current scene by using the method SceneManager.LoadScene
with the LoadSceneMode.Additive
flag.
Example: SceneManager.LoadScene ("MinigameSceneName", LoadSceneMode.Additive);
That way all the objects from the loaded scene get added to your current scene. Both scenes now coexist with each other in the same 3d space.
To close the minigame, use SceneManager.UnloadSceneAsync ("MinigameSceneName");
Note that all scripts from the "background scene" are still active, so you might want to set your input controller to inactive while the minigame is active.
The minigame scene won't get loaded "in a window", but you can fix that by the scene being a window in form of an own UI canvas.
If you don't want to implement your minigame with just the UI system, you can add a secondary camera to the scene which shows the minigame. To make that second camera render everything it sees on top of the output of the first camera, set it's "Depth" higher than that of the first camera and set its "Clear Flags" to "Depth Only". You can also edit the "Viewport Rect" of your minigame camera to only draw inside a defined rectangular area. Another feature which could be useful here is the "Culling Mask" which controls which camera renders which layers. When primary game and minigame use different layers, you can easily use culling masks to make sure that they don't interfere with each other visually. For more information, check the documentation of Camera.