The num.recovery.threads.per.data.dir broker property is a cluster-wide dynamically configurable setting, but it does not appear that it would have any dynamic effect on actual broker behavior.
The recovery thread pool is currently only created once when the LogManager is started and the loadLogs() method is called. If this property is later changed dynamically, it would have no effect until the broker is restarted.
This might be confusing to someone modifying this property, so perhaps should be made more clear in the documentation, or perhaps changed to a read-only property. The only benefit I see to having it be a dynamic config property is that it can be applied once for the entire cluster, instead of individually specified in each broker's server.properties file.