Почему в данном примере this вызывается в контексте window и как это изменить?
I. Чтобы разобраться, вставьте повсюду console.log().
Так узнаете, где this – ваш объект, а где становится «вдруг» window:
console.log("внутри timeout", this);

II. Освежите отличия стрелочных функций (callback) => { ... } от обычных function() { ... }
В исходном коде this.response = function() { .. тут собственный this.. }  Когда передаёте аргументом ..(t.response), он улетает из контекста Window, поэтому в нём this == window.  
Попробуйте использовать стрелочную функцию:   this.response = () => { .. тут this на момент обращения к нему .. }

III. Посмотрите на исходный код и скажите, что раньше исполнится: callback() или this.data = "Steve Jobs" ?

Вот так, вроде бы, работает, как ожидается. С минимальными изменениями:spoilerfunction test() {
  
  this.data = null;
  this.response = function() {
    console.log(this, this.data);
  }
  this.connect = function(callback) {
    setTimeout(() => {
      this.data = "Steve Jobs";
      callback.call(this);
    }, 500);
  }
}

t = new test();
t.connect(t.response);
В test создайте переиенную self=this и юзайте её