これについては、次のドキュメントで説明されています: http://knockoutjs.com/documentation/custom-bindings-controlling-descendant-bindings.html
ドキュメントから:
with や foreach などのバインディングは、バインディング コンテキスト階層に追加のレベルを作成します。これは、その子孫が $parent、$parents、$root、または $parentContext を使用して外部レベルのデータにアクセスできることを意味します。カスタム バインディングでこれを行う場合は、bindingContext.extend() を使用する代わりに、bindingContext.createChildContext(someData) を使用します。
例:
ko.bindingHandlers.withProperties = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
// Make a modified binding context, with a extra properties, and apply it to descendant elements
var newProperties = valueAccessor(),
childBindingContext = bindingContext.createChildContext(viewModel);
ko.utils.extend(childBindingContext, newProperties);
ko.applyBindingsToDescendants(childBindingContext, element);
// Also tell KO *not* to bind the descendants itself, otherwise they will be bound twice
return { controlsDescendantBindings: true };
}
};