How to refactor code to abstract data from a complex object into a single object without using foreach statements
First of all, there is a bug in your example. In this loop:

foreach (var geo in con.Geometries)
{
    data.DateTime = geo.Date;
    Event.Add(data);
}


You are just overwriting date in the same object. You should create a new object instead. Your final list will have the same object twice with the same date.

As for better solution for this, you can use linq and create something like this:

IEnumerable&lt;EventDTO&gt; events = 
    from e in content.Events
    from c in e.Categories
    from g in e.Geometries
    select new EventDTO { Id = e.Id, Title = e.Title, CategoryTitle = c.Title, DateTime = g.Date };