From the question, it could be inferred that you are not concerned about the visibility of the grey element. Sometimes in angular based websites isenabled isdisplayed etc won't work properly due to the asynchronous nature and the use of non-css way of enabling and disabling elements (eg using jquery to disabled an element than setting disable property)
So it is better to check if the element is present than visible:
EC.presence_of_element_located((By.CSS_SELECTOR , 'div[style="block"][id="loading"]'))
The above code assumes that the grey element takes a few seconds before appearing and then disappearing. So, first, we will wait for it to appear and then wait for it to disappear.
Else, if we directly check if style="none" without checking if it has changed to block first. Then the condition will become true as the change to style="block" hasn't happened yet. So, the scripts try to execute the next line which would be clicking the element but by that time the grey element appears and blocks the click.
Hence, first check for block , and then check for none.