I think I found the solution.
First, use NavigationStack.
On a side note, if you put .background(.red) on the ScrollView, you actually have a red background color.
However I think what you want is to have a persistent background color when navigation happens in the NavigationStack, no matter what view gets pushed into it.
Normally, any view that is pushed onto that, will have its own background color, overriding anything that is behind that, and Color.clear will have no effect, it will always have at least a white background that you can't remove.
See this solution to make the NavigationStack itself transparent: [1]: Remove background from NavigationStack in SwiftUI
Then use this to remove the default white(or any) background color from any new view you push onto the NavigationStack.
.introspect(.viewController, on: .iOS(.v13, .v14, .v15, .v16, .v17, .v18)) {
$0.view.backgroundColor = .clear
}
Now you have a fully transparent NavigationStack and you can use a ZStack (or something else) to wrap around the NavigationStack and set a normal .background(Color.anything) and you will have a persistent background color behind the NavigationStack.