When to use "if" or "without"?
For your example, you should exclude the fictional towns in the initial query itself rather than filtering them out afterwards:

{% set towns = craft.entries.section('towns').townFictional('not 1').relatedTo(counties) %}


So that no towns with the Fictional Lightswitch on will be returned from the database at all.

You would use the |without filter, if you already had an array of items and you wanted to filter some of them out while looping over them. This works best with arrays of simple primitives, such as an array of entry IDs, rather than whole objects.

You would be more likely to use an {% if %} tag if you still wanted to fetch the entry, but wanted to adjust some part of your output based on a condition. So for example if you had an array of entries from different sections, and they might not all have URLs, you might decide to output a link or just the title:

{% for entry in entries %}
    {% if entry.getUrl() %}
        &lt;li&gt;&lt;a href="{{ entry.getUrl()"&gt;{{ entry.title }}&lt;/a&gt;&lt;/li&gt;
    {% else %}
        &lt;li&gt;{{ entry.title }}&lt;/li&gt;
    {% endif %}
{% endfor %}