It's not a great answer, but here's what I've come up with, and it actually works quite well:
struct EditableTextRow: View {
@State var text: String = ""
var body: some View {
ZStack(alignment: .leading) {
Text(text)
.padding([.leading, .trailing], 5)
.padding([.top, .bottom], 8)
.foregroundColor(Color.clear)
TextEditor(text: self.$text)
}
}
}
It even works correctly with dynamic type, though there may be other accessibility impacts I haven't run into yet.