It's hard to add anything to Andrej's or Neel's explanations, but I'll give it a shot. I'm going to try to address the syntactic point of view, rather than try to uncover underlying semantics, because the explanation is more elementary and my give a more straightforward answer to your question.
I am going to work in the simply-typed $\lambda$-calculus rather than the more complex system underlying Haskell. I believe in particular that the presence of type variables may be confusing you to a certain extent.
The crucial reference is the following:
Mendler, N. (1991). Inductive types and type constraints in the second-order lambda calculus. I haven't found a reference online I'm afraid. The statements and proofs can however be found in Nax's PhD dissertation (a highly recommended read!).
Mendler explains that positivity is a necessary and sufficient condition for termination in the presence of non-recursive case definitions (and structurally decreasing recursive ones). He states it using an equational formulation. I give a simple example, which is a simplification of your $\mathrm{Bad}$ type.
$$ \mathrm{Bad} = \mathrm{Bad}\rightarrow A$$
Where $A$ is any type. We then have
$$ \lambda x:\mathrm{Bad}.x\ x: \mathrm{Bad}\rightarrow A$$
and so
$$ (\lambda x:\mathrm{Bad}.x\ x)\ (\lambda x:\mathrm{Bad}.x\ x): A $$
Mendler shows that this can be carried out for any type
$$ \mathrm{Bad} = F(\mathrm{Bad})$$
where $F(X)$ is a type with at least one negative occurrence of $X$ (there may be positive occurrences as well). He gives an explicit term which fails to terminate for a given $F(X)$ (pages 39-40 of his thesis).
Of course you are working not with equationally defined types but with constructors, i.e. you have
data Bad = Pack (Bad -> A)
rather than strict equality. However you can define
unpack :: Bad -> (Bad -> A)
unpack (Pack f) = f
which is sufficient for this result to continue to hold:
(\x:Bad -> unpack x x) (Pack (\x:Bad -> unpack x x))
This term is still well typed of type $A$.
In your second example, things are a bit more tricky, as you have somethings along the lines of
$$ \mathrm{Bad} = \mathrm{Bad}' \rightarrow A$$
where $\mathrm{Bad}'$ is related, but not equal, to $\mathrm{Bad}$ (in your case they are equal to $\mathrm{Bad}\ a$ and $\mathrm{Bad}\ (\mathrm{Not}\ a)$ respectively). I'll admit that I could not build a straightforward isomorphism between the two. The same problem is present if you replace
type Not a = a -> False
with
data Not a = Not a
It would be easily solved if Haskell allowed such type definitions:
type Acc = Not Acc
In this case, you could build a looping combinator in exactly the same manner as before. I suspect you can carry a similar (but more complex) construction using
data Acc = D (Not Acc)
The trouble here is that to build an isomorphism
Bad Acc <-> Bad (Not Acc)
you have to deal with mixed variance.