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);