You can "jump to definition" quickly, which generally works well. So the placement doesn't matter too much. Even if it proves troublesome, I don't find "finding Codable extension in Foo.swift" much different from "finding Foo extension in Codable.swift".
All the suggestion above are for maximizing private/fileprivate. I tend to use file as a mini-module. It does help that you don't cross the file boundary too much. If I want to find private Foo.property, I don't need to switch file, and can find all occurrences quickly. Also, private identifiers don't collide with ones in other files, allowing you to use generic names like height, width, etc. You can even use simple "search"/"replace" instead of sophisticated "refactor" which I see as a neat plus.
Most of the time there are only a few objects that mutates an observable. The rest will just read. The write portion generally need some private access to observable object, that's why I put it there.
If there are multiple writers though, I'll just put it in a separate file.
Perhaps, hence the misc.swift. Then there is this exception that you generally want to know about some constants when you see them being used. So the single-file exception is kind of striking that balance for me. You can even use generic name (with private of course) which would collide otherwise.
In one project, I use multiple color pickers, each with its own colorSpace. I could do rgbPickerColorSpace, labPickerColorSpace, etc., but putting it at the top of the file and name them colorspace is much more concise. I find myself doing this a lot.
Global vars can be very troublesome, you already assume a few things about them, that it's the same application-wide, accessing it should be thread safe, just like singletons. At the same time, it doesn't look the part, it looks just like normal local variable and it can throw you off your reasoning at a glance at the code. I tend to wrap it in a namespace (empty enum), or use singleton altogether.
Though often time, it can be refactored into some top-level values, like EnvironmentValues or EnvironmentObject from the top-view.
Then the placement doesn't really matter to me. I'd treat it as a namespaced constant, and put in the same file as the original class/struct. Sometimes extension uses properties of other object (extending Foo, but implementation relies heavily on accessing Bar), that's what I'm talking about.