One solution, using $scope.$watch :
http://jsfiddle.net/Kpjzj/
Since the key in an object literal has to be a string or identifier, not a variable, you have to assign it with obj[variableKey] = syntax, which is problematic to do in an angular expression. I fell back to having a model for the key and a model for the value and a model for the filter object, and each time the key or value model changes, update the filter model. This pattern should provide a bit of flexibility in the behavior of your filter.
Alternatively you could write your own filter, that takes an array [key1, value1, key2, value2, ...], which effectively translates to the filter directive using the object {key1: value1, key2: value2} where the keys are the values of variables with the name keyN. An example:
http://jsfiddle.net/qNfPH/2/
So there are two possible solutions. Both of these assume that unless both the key and value to search on are truthy, you don't want to filter, but you could change that easily enough.