I think the problem has to do with the init in AppModel and initializing model outside of body. Does the behavior change when you initialize model inside an onAppear or task modifier?
The @State documentation states the following for observable objects:
A
Stateproperty always instantiates its default value when SwiftUI instantiates the view. For this reason, avoid side effects and performance-intensive work when initializing the default value. For example, if a view updates frequently, allocating a new default object each time the view initializes can become expensive. Instead, you can defer the creation of the object using thetask(priority:_:)modifier, which is called only once when the view first appears
Delaying the creation of the observable state object ensures that unnecessary allocations of the object doesn’t happen each time SwiftUI initializes the view. Using the
task(priority:_:)modifier is also an effective way to defer any other kind of work required to create the initial state of the view, such as network calls or file access.
Also see this post: @Observable init() called multiple times by @State, different behavior to @StateObject