Как вывести нужную информацию?
Ваш код обрывается на первой же итерации, если правильно понял логику, то надо так:function lookUp(firstName, prop){
  for(var i = 0; i < contacts.length; i++) {
    if(contacts[i].firstName === firstName) {
      if(!contacts[i].hasOwnProperty(prop)) {
         return "No such property";
      }
      return contacts[i][prop];
    }
  }
  return "No such contact";
}
Ну, дело в том, что у Вас дело до ходит только до первого элемента массива contacts, и в любом случае на первом же элементе происходит return  чего-либо (в данном случае "No such contact").
Можно переписать функцию lookUp, например, таким образом:function lookUp(firstName, prop) {
  var contactExists = false;
  for(var i = 0; i < contacts.length; i++)
  {
    contactExists |= (contacts[i].firstName === firstName);
    if(contactExists && contacts[i].hasOwnProperty(prop))
      return contacts[i][prop];
  }
  return contactExists ? "No such property" : "No such contact";
}

// Change these values to test your function
console.log(lookUp("Harry", "likes"));
Данный код (используя данные из вопроса), выводит [ 'Hogwarts', 'Magic', 'Hagrid' ]