I figured it out!
It's because the css had:
-webkit-transition: left 0.3s ease-out;
transition: left 0.3s ease-out;
In this scenario I got an odd side effect where the 1.5 duration in my code would become a delay for some reason. Maybe I found a bug? I think TweenLite should not be influenced in any way from the css transition code.
TweenLite.to($(menuID), 1.5, { left: 100, onComplete: function(){
alert('helloworld');
}});
That said, how do you destroy TweenLite.to(); after it's done?