Your code is mixing a synchronous return with asynchronous callbacks, the following code should do the right thing:
return driver.wait(function() {
return driver.findElement(locator).isDisplayed();
}, timeout);
The inner function will return a promise that driver.wait
will wait for and will take its value (true/false) as the waiting condition.