We have a community cookbook (A) which includes a recipe specified in an attribute (att = A::inc) into the default recipe so that users of the cookbook can change the recipe by overwriting the cookbook attribute.
We have a cookbook (B) which depends on community cookbook which overwrites the attributes in the community cookbook. If we overwrite the attribute which stores the recipe name which gets included in the default recipe (att = B::inc) the attribute gets overwritten, but chef-client run fails since the community cookbook (A) is not dependent on our cookbook (B) which is expected and we don't want to change the metadata of the community cookbook (A).
In order to over come this, we have a third cook book (C) which depends on community cookbook (A) and our coon book (B) which does the over writing on the attribute value att = B::inc in its default recipe. This allows the recipe B::inc to be included by the community cookbook A. Let me know if there are any issues with this approach.
This will work fine, but you don't NEED the third cookbook. You could create a recipe in cookbook B which is a no-op. Then add that recipe to the runlist of the node. This will cause the cookbook B to load on the node. You could alternatively set the node attribute inside that recipe rather than in node's attributes directly. Then, by putting said recipe in your runlist, you would get both done. So, either:
# recipe B::dummy.rb
# do nothing
OR
# recipe B::useme.rb
node['some']['attribute'] = 'B::dothis.rb'