One fix, for bottles that have the real .NET Framework.
If you installed .NET through the dotnet48 recipe (the Assetto Corsa launcher needs it, for example), Repair on that bottle never finished, and neither would an engine update that changes the Wine build. Wine's setup step re-registers a list of system DLLs on every boot, and one of them, mscoree.dll, is Microsoft's own .NET shim in such a bottle; registering it loads the .NET runtime and never returns under 32-bit emulation, so the boot waited on it forever.
Highball now sets that file aside for the duration of the boot and puts it back right after, so the step skips it and the boot finishes in seconds. .NET itself is untouched: the file, the override that makes Wine use the real runtime, and the framework's registry keys are exactly as before, and a boot that dies halfway is repaired by the next launch. Bottles without the real .NET are not affected.
Details, including the approaches that do not work, are in issue #49.