I can confirm that joined tables are properly served by QGIS server as WFS
my setup:
postgres geometry_table
postgres attribute_table
The tables are joined by QGIS desktop (add geometry table as a layer, add attribute table as table, layer-properties->join and select table and fields to join on)
Using QGIS desktop, check that the join works by inspecting an object in the geometry layer and check that the joined attribute data is displayed correctly
Save the QGIS project and add it to QGIS server. Create a new QGIS desktop project and add the WFS layer from your GIS server. Select an object from the resulting WFS layer and check that all joined attributes are available.
Works with QGIS 2.18 on Ubuntu 16.04 (both desktop and server).
If QGIS server is not working as expected, add the following line to your Apache QGIS server configuration:
FcgidInitialEnv QGIS_SERVER_LOG_FILE /tmp/qgis-000.log
FcgidInitialEnv QGIS_SERVER_LOG_LEVEL 0
Restart apache and check log file /tmp/qgis-000.log for problems.
One possible problem is performance. QGIS server is likely doing the join (not the database). This would work fine if the join is done once per fcgi process. If done for every request, the join might become a big peformance hog?