2-way data binding refers directly to the ng-model directive, it's meaning is that you can change a model value in the view (via an input ng-model) and also change it programmaticly, either change will be replicated to the other and in the view.
ng-repeat is simply an expression that gets evaluated when a digest cycle starts so this is not 2-way data binding.
In terms of performance angulars binding process uses dirty checking and is not ideal, using an ng-model or not will make no difference to this. The digest cycle will only start if the model value changes or if you change a model value in angulars context.
After seeing the code snippet you provided the {{::model}} notation will simply create a one time binding, this means that the value will never change in your view and it won't be watched.
The different is {{value}} gets watched, when it changes this binding gets updated, this is slow on performance due to dirty checking however in your example the value is not watched, it's never checked and if used in a conditional statement is only evaluated once.
It's up to you if you want to use either, if a value will never change then use {{::}} as it's fast, if the values going to change in the future use {{}}