By "practical applications" I mean in usual programming/industry. I am particularly interested in cases where the inductive-inductive types cannot be easily replaced by inductive-recursive types.
One example that comes to mind is writing other programing languages. What are some others?
I would consider the following use of inductive-recursive types to be somewhat practical:
module _ (A : Set) (_#_ : A → A → Set) where
data Dlist : Set
Fresh : Dlist → A → Set
data Dlist where
nil : Dlist
cons : (b : A) (u : Dlist) (b' : Fresh u b) → Dlist
Fresh nil a = 𝟙
Fresh (cons b u b') a = (b # a) × Fresh u a
(Though it's arguable if it's just easier to use plain inductive types with extra data.)