A solution I have found is an empty VStack with the actual content as an .overlay(). This allows the content to expand naturally while removing it from the horizontal layout of the view.
VStack {}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.overlay(alignment: .leading) {
ScrollView {
...
}
.frame(minWidth: 550, maxWidth: .infinity)
}