why do we need row sampling in random forests?
First I think your understanding of “column sampling” is incorrect.  Random forest try’s a subset of features for each split.  It does not sample without replacement within an individual tree.
Random forest samples rows with replacement (bootstrap samples) to remove correlation between the decision trees.  Think about it, if you didn’t do this even though you create each split based on only a subset of features, your trees would end up looking fairly similar (or at least more similar than if you bootstrapped).  You do have larger bias due to creating trees based only on about ~63% unique values but the decrease in variance by having more uncorrelated trees makes up for it.