Actually it's depends on requirements
Here you can only use By locator because if you have already found WebElement then there is nothing make sense to use this ExpectedConditions by passing WebElement.
visibilityOf(final WebElement element) :
An expectation for checking that an element, known to be present on the DOM of a page, is visible. Visibility means that the element is not only displayed but also has a height and width that is greater than 0.
Means if you have WebElement and you already know this element present on the DOM and would not be stale means this wouldn't throw StaleElementException due to changing of the page at run time but you doesn't know element is visible or not then use this ExpectedConditions by passing WebElement.
Means if you have WebElement and you already know this element present on the DOM and would not be stale means this wouldn't throw StaleElementException due to changing of the page at run time but you doesn't know element is visible and enable or not then use elementToBeClickable(final WebElement element).
But some time due to ajax or other reason if page would be change during checking elementToBeClickable(final WebElement element) ExpectedConditions then it couldn't meet with condition due to StaleElementException because in elementToBeClickable(final WebElement element) condition selenium only check for visibility and enable condition for already found WebElement while using elementToBeClickable(final By locator) ExpectedConditions selenium goes to find element before checking that element is visible and enable to overcome the chance of failure due to StaleElementException.
So this is the benefits of using By over WebElement Here.