Что будет, если применить subscribeOn() к Subject?

Посмотреть в Telegram: @AndroidSobes/111
Зависит от Subject.

Чтобы ответить на вопрос, надо понимать, как работает subscribeOn().
subscribeOn(), как и другие операторы RxJava, создает враппер вокруг исходного Observable. Вызов метода subscribe() идет вверх по rx-цепочке в текущем треде, пока не доходит до враппер-класса ObservableSubscribeOn. После этого вызов subscribe() делегируется на исходный Observable, но тред меняется на заданный в Scheduler оператора subscribeOn().

Далее ситуация различается для Observable и Subject.

В случае обычного cold observable вызов subscribe() инициализирует рассылку элементов вниз по цепочке. Другими словами, начинаются вызовы onNext() на подписчике, переданном в методе subscribe(). При этом поток остается тот же, в котором вызван subscribe(), а именно заданный оператором subscribeOn().

В случае Subject (hot observable) вызов subscribe() добавляет подписчика в массив и, в зависимости от вида Subject, рассылает или нет предыдущие элементы. Рассылка кэшированных элементов инициализируется в том же потоке, в котором вызван subscribe(), в потоке шедулера subscribeOn().

Когда же на Subject вызывается onNext() после подписки, вызов идет вниз по rx-цепочке без изменения треда, до первого observeOn(). Т.е. subscribeOn() больше не имеет эффекта.

Итог:
Для PublishSubject subscribeOn() не меняет тред, на котором вызывается onNext();
В случае BehaviorSubject, ReplaySubject и UnicastSubject, subscribeOn() применяется только к элементам, отправленным до вызова subscribe().
С AsyncSubject все совсем запутанно. Если subscribe() вызван после onComplete(), то onNext() получает кэшированный элемент и вызов происходит в потоке шедулера subscribeOn(). Если же subscribe() вызывается до onComplete(), то onNext() подписчика получает элемент в том же потоке, в котором вызван asyncSubject.onNext(), т.е. subsrcibeOn() не имеет эффекта.

Подробнее о том, как работает subscribeOn().
Еще подробнее.