lvalue

ふむ。参照の導入だとか演算子オーバーロードとの関連もありそうな。
C++ の場合、演算子オーバーロードがあるので、

class int_array {
public:
    int_array(size_t size) : data(new int[size]) { }
    ~int_array() { delete[] data; }

    int& operator[](size_t i) { return data[i]; }
    int operator[](size_t i) const { return data[i]; }

private:
    int* data;
};

int main()
{
    int_array array(10);
    array[0] = 10;
    return 0;
}

てな感じでオーバーロードされた演算子を使った式の評価結果を lvalue に使いたいという話があって、式の評価結果が参照ならとにかく lvalue になるようにってことなのではないかと。まぁ、だから

std::vector<int> x(100);
x.at(50) = 10;

なんてこともできるわけですが。
で、前置インクリメントは効率的な事情もあって参照を返すのが標準になったんだろうなぁ(この辺がイテレータ関係)。