Хороший вопрос. Они дают одинаковые результаты, но внутренние реализации совершенно разные.
EnumerableEx.For был бы добавлен в System.Interactive для поддержания двойственности между IObservable и IEnumerables. Обратите внимание, что Observable.For и Observable.SelectMany различаются:
IObservable<TResult> For<TSource, TResult>(IEnumerable<TSource> source, Func<TSource, IObservable<TResult>> resultSelector)
против.
IObservable<TResult> SelectMany<TSource, TResult>(this IObservable<TSource> source, Func<TSource, IObservable<TResult>> selector)
Следовательно, вы ожидаете, что EnumerableEx.For будет иметь эту подпись, а не ту, которая у него есть на самом деле:
IEnumerable<TResult> For<TSource, TResult>(**IObservable**<TSource> source, Func<TSource, IEnumerable<TResult>> resultSelector)
Однако, очевидно, что он не требует источника IObservable. Возможно, это было предназначено. Я хотел бы задать ваш вопрос на форумах Rx, чтобы узнать, есть ли у команды Rx ответ.