You may be running into the difference between synchronous and asynchronous programming.  
In a nutshell, result is returned immediately, while observer.next is only called once the onload function is executed some time in the future which might be immediately, seconds later, or even never.
So once you try to do something asynchronous, you effectively have to execute the result handler as a different block of code.
If I were wanting to get the result from a FileReader, I'd usually go for a promise approach, (rather than an Observable) as I'm only expecting a single value (or an error).  While similar, Promises are a bit simpler, while Observables are more powerful.
A rough example:
function getFileContents(file) {
  return new Promise((resolve, reject) => {
    var reader = new FileReader();
    reader.onload = evt => resolve(evt.target.result);
    reader.onerror = err => reject(err);
    reader.readAsText(file);
  });
}
This function will give you back a Promise<string> (a promise that contains a string).  You still need to "unwrap" the promise to get the internal value though (using then or async/await-style programming).
If you are really sure you want an observable, then I'd probably still use the above promise function, but call it like this:
import { from } from 'rxjs'; 
function getFileContents(file) {
  ...
}
const myObservable = from(getFileContents(fileBlob));