I am wondering if JSON-LD contact markup should be placed on a homepage or Contact Us information page, or if both is fine.
Both are fine, or either one is fine. As long as search engines can crawl that specific page, they will most likely take note.
Google states in their structured data spec: "Include the contact markup on one page in your official site." (https://developers.google.com/search/docs/guides/enhance-site) Which is to say, one is enough.
Google has stated before that JSON-LD structured data should appear wherever it mirrors the content. So if your Contact Us page has all that info, it makes most sense to include the JSON file on that page. However, your home page may also have this info, or you may have the info in your global footer, so the home page could work too. You won't get penalized for both, but one will be fine. (My personal preference is the Contact Us page, just because it makes sense, particularly if you have your complete info there and not just a web form.)
According to Structured Data General Guidelines of Google structured data (json-ld is one of the supported formats) should represent the main content of the webpage. Here the keyword is the main content. If your homepage has the main content as your contacts, then set this markup for contacts. But, if your homepage represents your local business, then install the markup for the type LocalBusiness, as representing the main content. However, by using this type, you can create nested markup for your contacts. To do this, use the property contactPoint and embed the type ContactPoint. This type contains many properties for marking your contacts. In this way, you will create structured data for the main content as local business and embedded data of your contacts as information's part of your local business. Probably it will be semantically logical.
Read more: Google: Structured Data Should Be Unique to Each Page and SEO Snippets of YouTube with John Mueller.