That’s pretty much expected. Index is used when you have a global lookup. In your case, the first has("property", true) is a global lookup, so it leverages index. The second has("property", true) is to check neighbors, or in other words, a local lookup, so it does not use index.
Depending on your data, there are a couple of things you can try:
1) You can build an index for edges, which indicates whether two endpoints have opposite properties.
2) You can use different edge labels to indicate different cases. Try with and without vertex-centric indexes.
3) Retrieve all vertices with property=true and all with property=false, do in-memory filtering in your application.