AnimationFrameController: requestAnimationFrame made easy
What about two AnimationFrameControllers

That will work just fine?

As a games/visualisation programmer I would not use your  AnimationFrameController. It is just a callback stack, with ugly bits and would be difficult to use (you are catching my throws), GC unfriendly, carries a bad bug if I use  AnimationFrameController.pause = false; and should be a singleton

A breakdown of your code.

Don't use class, its is really bad and makes it so hard to write good javascript.
AND
You will only ever need one instance of AnimationFrameControler so it should be a singleton.

class AnimationFrameController {
  constructor( autostart = true ){
    this.autostart = true;
    this.paused = true;
    this.time = 0;
    this.fps = 0;


callees &amp; calleesTime do not need to be exposed, programmers will just side step your add/remove function trying to take short-cuts then if you ever change the behaviour you will have a list of upset emails. "Why your code break?" Don't expose what should not be exposed. 

Also why keep two arrays, why not just a simple object added to callees array {callback : callback, time : time}

    this.callees = [];     
    this.calleesTime = []; 
  }


Just bad a function call to get a exposed value. Use get to get abstract values not object properties.

  get time(){
    return this._time;
  }

  set time(v){
    this.fps = (v - this.time) / 1000;
    this._time = v;
    return this._time;
  }


Again pause is a property of AnimationFrameController why force a function call to get its value.

  get paused(){
    return this._paused;
  }


BUG: This function is will generate additional requestAnimationFrame loops on top of the current loops.

  set paused(v){
    this._paused = v;  
    if( this._paused === false ){ // if not paused 
      this.loop( this.time );     // call loop which on the 3rd line requests an animation fame without checking if 
                                  // there is one currently pending..
    } 
  }

  add( ...handlers ){
    handlers.forEach( handler =&gt; {
      if(handler instanceof Function){
        this.callees.unshift( handler );
        this.calleesTime.unshift( this.time );
      }
    });


Bad style this code would not pass a linter without a pile of opt outs. Always add { }

    if(this.callees.length &amp;&amp; this.autostart &amp;&amp; this.paused) this.paused = false;
  }
  remove( ...handlers ){
    handlers.forEach( handler =&gt; {


Why let for a function scope? Incorrect scope declaration can lead to bugs, use var if the variable is function scoped.

      let index = -1;
      while((index = this.callees.lastIndexOf( handler )) &gt;= 0){
        this.callees.splice( index, 1 );
        this.calleesTime.splice( index, 1 );
      }
    });


Missing {} 

    if(this.callees.length &lt;= 0) this.paused = true;
  }
  loop( time ){


This try catch would be very annoying during development, completely unacceptable in release code. 

You are not responsible for the functions you call and you should not attempt to circumvent any error handling system they have in  place by adding a cover all try catch. If there is a potential error to be thrown by your code then check for it and handle it. Don't use try catch unless you are at the application level.

try {

  if( !this.paused ){

    window.requestAnimationFrame( this.loop.bind(this) );


Is there any particular reason you use let here???

    let delta = time - this.time;
    this.time = time;


The next section is just wrong for way too many reasons. This is an animation controller, the number one enemy of animations is GC and you are just creating dead memory for no reason. Also forEach is SLOW SLOW SLOW just use a standard for loop it is much more efficient.      

    this.callees.map(( handler, index ) =&gt; {
      let progress = time - this.calleesTime[index];
      return handler( delta, progress ) === false ? handler : true; 
    }).forEach(handler =&gt; {
      return handler !== true ? this.remove(handler) : 0; 
    });


Above code rewrite. The following will not use up memory, and be an order of magnitude quicker.

    var i; // &lt;&lt; hoist
    for (i = 0; i &lt; callees.length; i += 1) {
        if (callees[i]( delta, time - this.calleesTime[i] ) === false) { 
            this.remove(callees[i]);
            i--; // so you don`t skip a item
        }
    }



  }

} catch(e) {
  this.paused = true;
  console.warn('An error has occurred while running the AnimationFrame.', e);

}