How/Can does Craft handle ancestor/grandparent relationships?
As usual with Craft you have several options. If you didn't need the index pages, I would suggest a location category, which you organized into 3 levels: states, regions, counties. Selecting a county location would also select its containing region and state. In your town entry you would do:

{% for l in entry.locations %}
  {{l.title}}
{% endfor %}


You would go through the loop three times, and {{l.title}} would be the state, region, and then county.

Disadvantages:


nothing in Craft enforces that you properly organize your location categories
nothing in Craft keeps you from choosing 3 states instead of one county for your town entry
the location index pages will be hard to write


Another option is to use a channel (or category) for states, a channel for regions, a channel for counties. The county entry would have a field for the containing region, the region entry would have a field for the containing state. And the town entry would have a field for the region. Then in the town template:

{{ entry.region.first.county.first.state.title }}


This will fail badly if any of the required relationships aren't there. You can test everything before you use it:

{% if entry.region.first %} ...


Or you can use the ?? (null-coalescing) operator:

{{ entry.region.first.county.first.state.title ?? 'no state' }}


Fetching the state title will be fairly expensive. You could use the preparse plugin to save the state name on the town entry.

For the index pages, you will want the regions that are related to the state, etc.