It's a context-dependent behavior, and it is an expected difference between client-side and server-side.
At runtime, the calculation is evaluated from the current context, so since A is not related to A_Occ, it returns blank on the server since there is no context (EG the server is blind to A_Occ even existing). Essentially by going to A_Occ or B on the server, you are establishing context.
I don't have a problem with other calculated fields evaluated in the context of another occurrence.
If I change the calculation for let's say "B:BID" instead of "List(B::BID) the field will display correctly on the the hosted database.
A field from another table is a different context than a calculation that evaluates a field to another table.
Same goes for one table occurrence vs. another.
Same goes for calculations evaluated from one context vs. another.
You are proving that it is a context-related behavior by saying you can go to one of the layouts within the context of your calculation and get a result.
The example I gave in my original post was an oversimplified version of my real case.
I think this example even works just fine on an hosted database without having to move to the occurrences.
On my real database, the field actually list fields of a table related to B, let's call it C.
Anyway I see that it's clearly something related to the context of an hosted database.
Not sure to understand exactly why though.
I think I will do some more tests with a better example.