Vueインスタンスは複数作成することができる

<div id="app1">
	<p>{{ message }}</p>
</div>
<div id="app2">
	<p>{{ message }}</p>
</div>
new Vue({
    el: "#app1",
    data: {
        message: 'インスタンス1'
    }
});

new Vue({
    el: '#app2',
    data: {
        message: 'インスタンス2'
    }
})

外部からVueインスタンスにアクセスする時

<div id="app1">
	<p>{{ message }}</p>
</div>

<div id="app2">
  <p>{{ message }}</p>
  <button @click="changeMessage1">インスタンス1を変更するボタン</button>
			🔼別のVueインスタンスのデータプロパティを変更している
    </div>
let vm1 = new Vue({
    el: "#app1",
    data: {
        message: 'インスタンス1'
    }
});

let vm2 = new Vue({
    el: '#app2',
    data: {
        message: 'インスタンス2'
    },
    methods: {
        changeMessage1() {
            vm1.message = 'インスタンス2から変えました'
        }
    }
})

Vueインスタンスのデータプロパティに後付けした場合は、リアクティブに動かない

リアクティブ システム におけるウォッチャとは、setter内つまりデータが変更された時に、実行する関数になります。逆に監視プロパティと言うものは、データが変更された時に何か処理を書きたい時に使います。そういう意味では、watcherの1つに監視プロパティで定義された関数も含む、というイメージで考えていただければ大丈夫です。

もっと詳しく知りたい場合は、少し複雑ですが、こちらの公式ドキュメントを参考にしてみてください。

let x = 1; let y = x; x = 10;

とした時のyは、どうなるかというと、1のままです。もう一度y = xとする必要があります。ただしVue.jsではsetterやgetter、watcherなどを使って、x = 10とした時に、自動的に、y = xを内部的に実行してくれるようになっているというイメージです。今回でいうと、DOMの再描画が、y = xにあたります。本来であれば、el = document.querySelector(); el.textContent = 'hello'のようなことを書いて、再描画する必要があるのですが、それらを全て内部的に行ってくれており、その処理を持った関数をwatcherと言います。