Static var overwritten with WP AJAX action, works fine without AJAX

Instead of a static class property, you could use a PHP session:

class progress {

    public function __construct() {
        session_start();
    }

    public function getTotal() {
        return $_SESSION[ 'total' ];
    }

    public static function setTotal() {
        $_SESSION[ 'total' ] = '123';
    }
}

If you’re doing more complex stuff, a session wrapper like Symfony’s might be a good idea.