対応する値を設定する正しい方法は何ですか? 
「for ... in」でこれを機能させる方法。
私が self[state] に関連付けた関数は、ループ中に関連付けられたものではなく、states[state] の最新の値を使用してループの後に実行されるように見えます。
cssbtn = function(id, states, state){
  var self = document.getElementById(id);
  var states = states ||  {'off': '0px 0px', 'selected': '-20px 0px', 'selected2': '-40px 0px' };
  var state = state || 'off';
  for (state in states) {
    self[state] =  function (){
      alert(states[state]); //demo purposes
    }
  }
  self.onmouseover = function(evt){
    self.selected();
  }
  self.onmouseout= function(evt){
    self.off();
  }
  self.onclick= function(evt){
    self.selected2();
  }
  return self;
}